我目前有这段代码
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不是函数”,参考乘法数函数中的第2行。
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行)在回调本身。如有任何建议,如果这个问题含糊不清,请告诉我。谢谢!
答案 0 :(得分:0)
您无需使用申请。你可以这样做:
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/