承诺:如何通过参数传递函数?

时间:2018-08-04 22:47:30

标签: javascript node.js es6-promise

在以下测试代码中,我尝试将带有参数(即t2,t3)的预定义函数传递给。但是它抱怨“ r”没有定义。

var Promise = require('bluebird');

var t2 = function(r) {
    console.log("2r: " + r);
    return 2 * r;
};

var t3 = function(r) {
    console.log("3r: " + r);
    return 3 * r;
};

new Promise(function(resolve, reject) {

    setTimeout(function() {
        resolve(1);
        reject(2)
    }, 1000);
})
.then(t2(r), t3(r))
.then(t2(r), t3(r))
.then(t2(r), t3(r));

2 个答案:

答案 0 :(得分:1)

只需传递函数名称即可:

var t2 = function(r) {
  console.log("2r: " + r);
  return 2 * r;
};

var t3 = function(r) {
  console.log("3r: " + r);
  return 3 * r;
};

new Promise(function(resolve, reject) {

    setTimeout(function() {
      resolve(1);
      reject(2)
    }, 1000); // (*)

  })
  .then(t2, t3)
  .then(t2, t3)
  .then(t2, t3);

如果您实际上 要传递您事先知道的其他参数 ,请将t2t3 设置为高阶函数,它们返回函数,以便您可以在.then的参数列表中调用:

var t2 = extra => r => {
  console.log("2r: " + r);
  console.log('extra param: ' + extra);
  return 2 * r;
};

var t3 = extra => r => {
  console.log("3r: " + r);
  console.log('extra param: ' + extra);
  return 3 * r;
};


const r = 'foo';
new Promise(function(resolve, reject) {

    setTimeout(function() {
      resolve(1);
      reject(2)
    }, 1000); // (*)

  })
  .then(t2(r), t3(r))
  .then(t2(r), t3(r))
  .then(t2(r), t3(r));

答案 1 :(得分:0)

您没有将r传递给函数。 .then将值传递给回调。

new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(1)
    reject(2)
  })
})
.then((r) => /* do stuff with r here */)

如果您需要注销结果,则将有类似.then((r) => { t2(r); t3(r); })的内容。如果只需要返回乘法函数的结果(或其他结果),.then(t2)就可以工作(对于一个函数)。请注意,我在这里使用箭头功能。它们现在可以在Node和大多数浏览器中使用,但是如果需要,可以改用function关键字。

在这里您还奇怪地使用了逗号运算符-请记住,它与声明和 then 返回基本相同,并且由于您的函数不会执行任何突变( log的副作用),您实际上不会使用每个.then中的第一个功能来影响任何数据。