Uma promessa, apenas por exemplo:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Depois de chamarmos, o método da promessa:
P.then(doWork('text'));
A função doWork é semelhante a esta:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Como posso evitar o retorno de uma função interna em doWork para obter acesso aos dados dos parâmetros de promessa e texto? Existem truques para evitar a função interna?
javascript
promise
ecmascript-6
es6-promise
user3110667
fonte
fonte
bind
método horrível ? - que também é extremamente lento.Respostas:
Você pode usar
Function.prototype.bind
para criar uma nova função com um valor passado para seu primeiro argumento, como estee você pode mudar
doWork
para,Agora,
text
estará realmente'text'
dentrodoWork
edata
será o valor resolvido pela Promessa.Observação: certifique-se de anexar um manipulador de rejeição à sua cadeia de promessa.
Programa de trabalho: cópia ao vivo no REPL do Babel
fonte
call
invoca uma função no local,bind
cria uma nova função, porém ambos aceitam um contexto de execução como seu primeiro argumento.Talvez a resposta mais direta seja:
Ou, já que está marcado
ecmascript-6
, usando as funções de seta:Acho isso mais legível e não muito para escrever.
fonte
Use currying.
fonte
curriedDoWork
uma promessa ao fazerreturn new Promise()
na primeira linha desta função, a promessa será executada assim que você chamarcurriedDoWork()
(como você faz em..then(curriedDoWork('text'))
Lodash oferece uma boa alternativa para exatamente isso.
Ou, se desejar que sua função de sucesso tenha apenas um parâmetro (os resultados da promessa cumprida), você pode utilizá-la desta forma:
Isso se conectará
text: 'myArgString'
aothis
contexto dentro da função.fonte
A nova resposta a essa pergunta é usar as funções de seta, que vinculam automaticamente o 'this' e são muito mais legíveis. Google para links como: https://2ality.com/2016/02/arrow-functions-vs-bind.html
Você pode definir o texto como: this.text = 'text' P.then (data => doWork (data)); //this.text dentro do doWork será avaliado como 'texto'.
Isso é sugerido pelo jib acima e que (ou essa!) Deve ser a resposta aceita agora.
fonte