2017-02-15 23 views
0

我現在有這一段代碼()方法Promisify應用使用未知數目輸入變量的

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

我想使用這樣的替代,這意味着回調函數在實際的函數調用不會被傳遞,並承諾,預計將返回

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行)代碼在回調中。尋找任何建議,如果這個問題是模糊的,請讓我知道。謝謝!

+0

爲什麼promisify'multiplyAnyNumbers'代替promisifying'multiplyTwoNum'和'multiplyThreeNum'? – Bergi

+0

我沒有得到'multiplyAnyNumbers'的目的。你會在哪裏使用它並傳遞'f',而不是直接調用'f'? – Bergi

+0

您是否使用任何特定的承諾庫?許多人都有你在船上尋找的工具。 – Bergi

回答

0

你不需要使用apply。你可以這樣來做:

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/

+0

只要使用'Promise.resolve'而不是承諾構造函數,如果你沒有做任何實際的異步工作。當然,在這種情況下你不應該使用承諾。 – Bergi

+1

@Bergi根據您評論的內容改進了答案。沒有新的承諾可以這樣使用。謝謝。 –

相關問題