承诺,传递额外的参数然后链

use*_*667 89 javascript promise ecmascript-6 es6-promise

承诺,例如:

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

在我们调用之后,那么承诺上的方法:

P.then(doWork('text'));
Run Code Online (Sandbox Code Playgroud)

doWork函数如下所示:

function doWork(data) {
  return function(text) {
    // sample function to console log
    consoleToLog(data);
    consoleToLog(b);
  }
}
Run Code Online (Sandbox Code Playgroud)

如何避免在doWork中返回内部函数,以获取promise和text参数中的数据?避免内在功能有什么技巧吗?

jib*_*jib 97

也许最直截了当的答案是:

P.then(function(data) { return doWork('text', data); });
Run Code Online (Sandbox Code Playgroud)

或者,因为这是标记的ecmascript-6,使用箭头功能:

P.then(data => doWork('text', data));
Run Code Online (Sandbox Code Playgroud)

我发现这个最具可读性,而且写得不多.


the*_*eye 81

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

P.then(doWork.bind(null, 'text'))
Run Code Online (Sandbox Code Playgroud)

你可以换doWork

function doWork(text, data) {
  consoleToLog(data);
}
Run Code Online (Sandbox Code Playgroud)

现在,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);
Run Code Online (Sandbox Code Playgroud)

  • `call` 就地调用一个函数,`bind` 创建一个新函数,但是两者都接受一个执行上下文作为它们的第一个参数。 (2认同)

小智 5

使用柯里化。

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
);
Run Code Online (Sandbox Code Playgroud)