承诺,将其他参数传递给然后链接

一个承诺,例如:

var P = new Promise(function (resolve, reject) {
  var a = 5;
  if (a) {
    setTimeout(function(){
      resolve(a);
    }, 3000);
  } else {
    reject(a);
  }
});

在 promise 上调用方法后:.then()

P.then(doWork('text'));

然后函数看起来像这样:doWork

function doWork(data) {
  return function(text) {
    // sample function to console log
    consoleToLog(data);
    consoleToLog(b);
  }
}

如何避免在 doWork 中返回内部函数,以便从 promise 和 text 参数访问数据?有什么技巧可以避免内部功能吗?


答案 1

也许最直接的答案是:

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

或者,由于这是标记的,因此使用箭头函数:ecmascript-6

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

我发现这最易读,而且写得不多。


答案 2

您可以使用 Function.prototype.bind 创建一个新函数,其值传递给其第一个参数,如下所示

P.then(doWork.bind(null, 'text'))

你可以改变,doWork

function doWork(text, data) {
  consoleToLog(data);
}

现在,将实际存在,并且将是应许所解决的价值。text'text'doWorkdata

注意:请确保将拒绝处理程序附加到您的承诺链。


工作程序:Babel的REPL上的实时副本

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