Underscore: _.wrap не поддерживает функцию обертывания с аргументом

Созданный на 9 мар. 2013  ·  8Комментарии  ·  Источник: jashkenas/underscore

Сегодня при написании кода с использованием подчеркивания и магистрали мне пришлось обернуть некоторые функции. Я видел следующий пример на underscorejs.org

var hello = function (name) {return "hello:" + name; };
hello = _.wrap (привет, функция (func) {
вернуть «до» + func («мо») + «после»;
});
Привет();
=> 'до, привет: мо, после'

на второй последней строке
что, если вызов функции похож на
привет ("умар");
Я хочу сказать, что аргументы приходят извне.

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) {
// авторизуем действие create
return _createAlert (_type);
});
},
createAlert: function (type) {
//ПРОБЛЕМА:
// Здесь "this" указывает на [window global]
}
});
см. внутри функции createAlert, когда я напрямую вызывал функцию createAlert, она указала на просмотр, но когда я написал функцию-оболочку, она начала указывать на [window global]
Я хочу изменить ссылку на это, чтобы указывать на "вид"

Я новичок, чтобы подчеркнуть, пожалуйста, игнорируйте, если вопрос не имеет отношения к делу.
Кстати, подчеркивание - это здорово

Вам нужно будет вызвать _createAlert с контекстом, как показано ниже. Надеюсь, это поможет. :)

return _createAlert.call(this, _type);

кажется, что подчеркивание _wrap поддерживает только один параметр, используйте вместо этого:

fn = (function (fn, before, after, self) {
return function () {
если (до) before.apply (self, arguments);
var res = fn.apply (self, arguments);
если (после) after.apply (self, arguments);
return res;
}
}) (fn, до, после, это)

Вы также можете использовать партиал для этого zarehb

tnx megawac, partial больше для предварительного заполнения аргументов, не вызывая функции до и после

Перенос осуществляется через _.partial fyi

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 рейтинги