Pregunta Promesas, pasar parámetros adicionales a la cadena entonces


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 que llamemos entonces, el método es prometedor:

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 la función interna en DoWork, para obtener acceso a los datos de los parámetros de promesa y texto? si hay algún truco? Gracias.


75
2017-10-02 17:15


origen


Respuestas:


Puedes 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, text será en realidad 'text' en doWork y data será el valor resuelto por la Promesa.

Nota: Asegúrese de adjuntar un manejador 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);

68
2017-10-02 17:23



Quizás la respuesta más directa es:

P.then(function(data) { return doWork('text', data); });

O bien, ya que esto está etiquetado ecmascript-6, usando las funciones de flecha:

P.then(data => doWork('text', data));

Encuentro esto más legible, y no demasiado para escribir.


75
2017-10-05 00:15



Use currying

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
);

3
2017-10-22 10:53



Lodash ofrece una buena alternativa para esta cosa exacta.

 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 bien, si desea que su función de éxito tenga solo un parámetro (los resultados prometidos cumplidos), puede utilizarlo de esta manera:

P.then(_.bind(doWork, {text: 'myArgString'}));

function doWork(data) {
    console.log(data + " foo " + this.text);
    //promiseResults foo myArgString
}

Esto se adjuntará text: 'myArgString' al this contexto dentro de la función.


1
2018-05-19 19:47