代码之家  ›  专栏  ›  技术社区  ›  user180574

如何传递带参数的函数?[副本]

  •  0
  • user180574  · 技术社区  · 7 年前

    在下面的测试代码中,我尝试将带有参数(即t2、t3)的预定义函数传递给then。但它抱怨“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 回复  |  直到 7 年前
        1
  •  1
  •   CertainPerformance    7 年前

    只需传递函数名即可:

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

    如果你 事实上 希望传递其他参数 你事先知道的 ,制造 t2 t3 高阶 功能 返回 函数,以便可以在 .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));
        2
  •  0
  •   Zac Anger    7 年前

    你不能通过 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) 会起作用的。注意,我在这里使用的是箭头函数;它们现在可以在节点和大多数浏览器中工作,但是您可以使用 function 关键字代替,如果你想。

    这里还奇怪地使用了逗号运算符——记住,它基本上与使用语句和 然后 返回,因为你的函数不执行任何变异(只是 log 副作用),实际上不会影响每个函数中第一个函数的任何数据 。然后 .

    推荐文章