Underscore: _.wrap لا يدعم وظيفة الالتفاف مع الوسيطة

تم إنشاؤها على ٩ مارس ٢٠١٣  ·  8تعليقات  ·  مصدر: jashkenas/underscore

اليوم أثناء كتابة التعليمات البرمجية باستخدام الشرطة السفلية والعمود الفقري ، كان عليّ التفاف بعض الوظائف. رأيت المثال التالي على Undcorejs.org

var hello = function (name) {return "hello:" + name؛ } ؛
hello = _.wrap (hello، function (func) {
إرجاع "before ،" + func ("moe") + "، after" ؛
}) ؛
مرحبا()؛
=> "قبل ، مرحبًا: moe ، بعد"

في السطر الثاني الأخير
ماذا لو كان استدعاء الوظيفة مثل
مرحبًا ("عمر") ؛
أعني أن أقول إن الحجج تأتي من الخارج.

question

ال 8 كومينتر

يعتني التفاف بالفعل بمعظم هذا من أجلك. مصدر الالتفاف قصير جدًا للقراءة. هذا أو يمكنك إلقاء نظرة على المثال الموسع أدناه:

var greet = function(name, language){
  var response
  if (language === "sp") {
    response = "Hola"
  } else if (language === "fr") {
    response = "Bonjour"
  } else {
    response = "Hello"
  }
  return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"

شكرا على هذه الاستجابة السريعة. كان مفيدا جدا
أنا أستخدم العمود الفقري لتطوير تطبيق مؤسسة.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction: function () {
// هنا يشير "هذا" للعرض
this.createAlert: _.wrap (this.createAlert، function (_createAlert، _type) {
// تخويل إنشاء عمل
return _createAlert (_type) ،
}) ؛
} ،
createAlert: function (type) {
//مشكلة:
// هنا يشير "هذا" إلى [نافذة عالمية]
}
}) ؛
انظر داخل دالة createAlert عندما كنت أستدعى دالة createAlert مباشرة ، كانت تشير إلى العرض ولكن عندما كتبت وظيفة المجمع ، بدأت في الإشارة إلى [window global]
أريد تغيير الإشارة إلى هذا للإشارة إلى "عرض"

أنا جديد في التأكيد ، يرجى تجاهل ما إذا كان السؤال غير ذي صلة.
تسطير أسفلية راجع للشغل رائع

ستحتاج إلى استدعاء _createAlert مع سياق مثل أدناه. امل ان يساعد. :)

return _createAlert.call(this, _type);

يبدو أن الشرطة السفلية _wrap تدعم معلمة واحدة فقط ، استخدم هذا بدلاً من ذلك:

fn = (الوظيفة (fn ، قبل ، بعد ، النفس) {
وظيفة الإرجاع () {
if (before) before.apply (الذات ، الحجج) ؛
var res = fn.apply (ذاتي ، وسيطات) ؛
if (after) after.apply (الذات ، الحجج) ؛
عودة الدقة
}
}) (fn، before، after، this)

يمكنك أيضا استخدام جزئية لذلك الزريب

tnx megawac ، الجزئي هو أكثر لملء الحجج مسبقًا ولا يستدعي وظيفة قبل وبعد

يتم تنفيذ الالتفاف عبر _.partial لمعلوماتك

fn = _.partial(function(fn, before, after, self) {
    var args = _.rest(arguments, 4);
    if (before) before.apply(self,args);
    var res = fn.apply(self,args);
    if (after) after.apply(self,args);
    return res;
})(fn, before, after, this )

هذا صحيح وسيعمل ، ولكن في حالة رغبة أي شخص في الحصول على حل js خالص ، يمكن أن يأخذني خاصة أن استخدام الشرطة السفلية لا يمنحك أي فائدة في هذه الحالة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات