javascript - variable - Promesas, pasar parámetros adicionales para luego encadenar
pasar variables javascript (4)
Una promesa, solo por ejemplo:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Después de llamar, entonces el método de la promesa:
P.then(doWork(''text''));
La función doWork se ve así:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
¿Cómo puedo evitar devolver una función interna en doWork para obtener acceso a los datos de los parámetros de promesa y texto? ¿Hay algún truco para evitar la función interna?
Lodash ofrece una buena alternativa para esto exactamente.
P.then(_.bind(doWork, ''myArgString'', _));
//Say the promise was fulfilled with the string ''promiseResults''
function doWork(text, data) {
console.log(text + " foo " + data);
//myArgString foo promiseResults
}
O, si desea que su función de éxito tenga solo un parámetro (los resultados de la promesa cumplida), puede utilizarlo de esta manera:
P.then(_.bind(doWork, {text: ''myArgString''}));
function doWork(data) {
console.log(data + " foo " + this.text);
//promiseResults foo myArgString
}
Esto adjuntará el
text: ''myArgString''
al contexto
this
dentro de la función.
Puede usar
Function.prototype.bind
para crear una nueva función con un valor pasado a su primer argumento, como este
P.then(doWork.bind(null, ''text''))
y puedes cambiar
doWork
a,
function doWork(text, data) {
consoleToLog(data);
}
Ahora, el
text
será en realidad
''text''
en
doWork
y los
data
serán el valor resuelto por Promise.
Nota: Asegúrese de adjuntar un controlador de rechazo a su cadena de promesa.
Programa de trabajo: copia en vivo en REPL de Babel
function doWork(text, data) {
console.log(text + data + text);
}
new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function () {
resolve(a);
}, 3000);
} else {
reject(a);
}
})
.then(doWork.bind(null, ''text''))
.catch(console.error);
Quizás la respuesta más directa es:
P.then(function(data) { return doWork(''text'', data); });
O, dado que esto está etiquetado como
ecmascript-6
, usando funciones de flecha:
P.then(data => doWork(''text'', data));
Esto me parece más legible, y no demasiado para escribir.
Usa curry.
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
var curriedDoWork = function(text) {
return function(data) {
console.log(data + text);
}
};
P.then(curriedDoWork(''text''))
.catch(
//some error handling
);