【发布时间】: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而不是承诺multiplyTwoNum和multiplyThreeNum? -
我不明白
multiplyAnyNumbers的目的。你会在哪里使用它并传递f,而不是直接调用f? -
你在使用任何特定的 promise 库吗?许多人都有您在船上寻找的工具。
-
@Bergi 正在使用 Bluebird
标签: javascript node.js arguments prototype apply