Underscore: _.wrap não suporta a função de agrupamento com argumento

Criado em 9 mar. 2013  ·  8Comentários  ·  Fonte: jashkenas/underscore

Hoje, enquanto escrevia código usando sublinhado e backbone, tive que encapsular algumas funções. Eu vi o exemplo a seguir em underscorejs.org

var hello = function (name) {return "hello:" + name; };
hello = _.wrap (hello, function (func) {
retornar "antes," + func ("moe") + ", depois de";
});
Olá();
=> 'antes, olá: moe, depois'

na penúltima linha
e se a chamada de função for como
olá ("umar");
Quero dizer que os argumentos vêm de fora.

question

Todos 8 comentários

Wrap já cuida de quase tudo para você. O código-fonte para embrulhar é bem curto para ler. Isso ou você pode dar uma olhada no exemplo estendido abaixo:

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"

Obrigado por esta resposta rápida. Foi muito útil.
Estou usando o backbone para desenvolver um aplicativo corporativo.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction: function () {
// aqui "isto" aponta para ver
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// autoriza a ação de criação
return _createAlert (_type);
});
},
createAlert: function (type) {
//PROBLEMA:
// Aqui, "this" aponta para [janela global]
}
});
ver dentro da função createAlert quando eu estava chamando a função createAlert diretamente, ela estava apontando para view, mas quando eu escrevi função wrapper ela começou a apontar para [window global]
Eu quero mudar a referência disso para apontar para "vista"

Sou novo no sublinhado, por favor, ignore se a pergunta for irrelevante.
O sublinhado BTW é incrível

Você precisará chamar _createAlert com um contexto como o abaixo. Espero que ajude. :)

return _createAlert.call(this, _type);

parece que o sublinhado _wrap suporta apenas um parâmetro, use este em seu lugar:

fn = (função (fn, antes, depois, self) {
return function () {
if (before) before.apply (self, argumentos);
var res = fn.apply (self, argumentos);
if (after) after.apply (self, argumentos);
return res;
}
}) (fn, antes, depois disso)

Você também pode usar parcial para esse zarehb

tnx megawac, partial é mais para pré-preencher os argumentos e não chamar uma função antes e depois

Wrap é implementado via _.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 )

está correto e vai funcionar, mas caso alguém queira uma solução js pura pode levar a minha especialmente que usar o sublinhado não traz nenhum benefício neste caso!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

clouddueling picture clouddueling  ·  3Comentários

marcalj picture marcalj  ·  5Comentários

Francefire picture Francefire  ·  5Comentários

acl0056 picture acl0056  ·  5Comentários

danilopolani picture danilopolani  ·  5Comentários