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

时间:2015-10-02 17:15:37

标签: 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);
  }
});

我们打电话后,接下来的方法是承诺:

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

doWork函数如下所示:

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

如何避免在doWork中返回内部函数,以便从promise和text参数中访问数据?是否有任何技巧来避免内在功能?

6 个答案:

答案 0 :(得分:92)

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

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

或者,因为它使用箭头函数标记为ecmascript-6

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

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

答案 1 :(得分:75)

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

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

您可以将doWork更改为

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

现在,text 'text'实际上doWork datafunction 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); 将是Promise解决的值。

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

工作计划: Live copy on Babel's REPL

{{1}}

答案 2 :(得分:3)

使用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 :(得分:0)

Lodash为这件事提供了一个不错的选择。

 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
 }

或者,如果您希望您的成功函数只有一个参数(履行的承诺结果),您可以这样使用它:

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

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

这会将text: 'myArgString'附加到函数中的this上下文。

答案 4 :(得分:0)

此问题的新答案是使用箭头功能(自动绑定this并且可读性更强)。 Google提供的链接,例如: https://2ality.com/2016/02/arrow-functions-vs-bind.html

您可以将文本设置为:

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

注意:this.text内的doWork将评估为“文本”。

上面的臂架建议这样做,并且(或!)现在应该是可以接受的答案。

答案 5 :(得分:0)

使用它以便您可以访问承诺正文中的全局变量

var ref=this;

示例

p.then((data)=>{
  var ref=this;
});