【问题标题】:Promisify apply() method that uses unknown number of input variablesPromisify apply() 方法使用未知数量的输入变量
【发布时间】:2017-07-04 10:30:50
【问题描述】:

我目前有这段代码

let multiplyTwoNum = (foo, bar, cb) => {
  cb(null, foo * bar)
}

let multiplyThreeNum = (foo, bar, param, cb) => {
  cb(null, foo * bar * param)
}

function multiplyAnyNumbers(f) {
  f.apply(null, Array().slice.call(arguments, 1));
}

上面定义了两个基本函数,将传递给它们的数字相乘并通过回调返回值

现在我可以如下调用这两个函数。到目前为止一切正常。回调确实变得更加复杂,我希望 multiplyAnyNumber 改为返回 Promise。

multiplyAnyNumbers(multiplyTwoNum, 1, 2, (err, val) => {
  console.log(err) // Shows undefined
  console.log(val) // Shows 2
});

multiplyAnyNumbers(multiplyThreeNum, 1, 2, 3, (err, val) => {
  console.log(err) // Shows undefined
  console.log(val) // Shows 6
});

我想改成这样使用,这意味着回调函数不会在实际的函数调用中传递,并且期望返回一个promise

multiplyAnyNumbers(multiplyThreeNum, 1, 2, 3)
  .then(data => console.log(data))
  .catch(err => console.log(err))

multiplyAnyNumbers(multiplyTwoNum, 1, 2)
  .then(data => console.log(data))
  .catch(err => console.log(err))

我的尝试导致错误提示“cb 不是函数”,指的是乘数函数中的第二行。

function multiplyAnyNumbersNew(f) {
  let func = (err, val) => {
    console.log(err);
    console.log(val);
  }
  arguments[(arguments.length).toString()] = (err, val) => {
    console.log(err);
    console.log(val);
  }
  f.apply(null, Array().slice.call(arguments, 1));
}

重要的是我能够返回一个 Promise,就好像我必须通过回调然后使用它不会减少我需要编写的代码,因为代码块(约 40 行)在回调本身。寻求任何建议,如果这个问题含糊不清,请告诉我。谢谢!

【问题讨论】:

  • 为什么承诺multiplyAnyNumbers 而不是承诺multiplyTwoNummultiplyThreeNum
  • 我不明白multiplyAnyNumbers 的目的。你会在哪里使用它并传递f,而不是直接调用f
  • 你在使用任何特定的 promise 库吗?许多人都有您在船上寻找的工具。
  • @Bergi 正在使用 Bluebird

标签: javascript node.js arguments prototype apply


【解决方案1】:

您不需要使用应用。你可以这样做:

let multiplyTwoNum = (foo, bar) => Promise.resolve(foo * bar);

let multiplyThreeNum = (foo, bar, param) => Promise.resolve(foo * bar * param);

let multiplyAnyNumbers = (...args) =>
    Promise.resolve(Array().slice.call(args).reduce((a,b)=>a*b));

multiplyTwoNum(2, 5).then((val)=>console.log(val));
multiplyThreeNum(2, 5, 7).then((val)=>console.log(val));
multiplyAnyNumbers(1,3,5,7,9).then((val)=>console.log(val));
multiplyAnyNumbers(3,5).then((val)=>console.log(val));

JSFiddle:https://jsfiddle.net/0z1atb37/9/

【讨论】:

  • 如果你没有做任何实际的异步工作,只需使用Promise.resolve 而不是promise 构造函数。当然,在这种情况下你根本不应该使用 Promise。
  • @Bergi 根据您的评论改进了答案。新的 Promise 不能这样使用吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2020-12-22
  • 2019-02-12
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多