使用未知数的输入变量的Promisify Applion()方法



我当前有此代码

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

以上定义了两个基本函数,这些函数将传递给它们的数字乘以并通过回调

返回值

现在,我可以将这两个功能称为如下。到目前为止,一切正常。回调的确变得更加复杂,我希望乘数yanynumber返回诺言。

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

我想这样使用它,这意味着回调函数不会在实际函数调用中传递,并且有望返回承诺

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

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

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

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/

相关内容

最新更新