[英]How to call a function inside a promise with reduce function in javascript
這是我的數組
arr = [2,3,4]
這是我的功能
function functionMultpily(p1, p2) {
return( p1 * p2);
}
function functionADD(p1, p2) {
return( p1 + p2);
}
我需要在一個承諾中使用這個函數,這樣它應該通過使用 Reduce 函數從 arr 中獲取值來一個接一個地完成。
首先確保您的函數返回承諾,例如返回Promise.resolve(a*b)
而不是a*b
。
然后在值數組上應用reduce
,在每次迭代中,您將一個承諾累積(鏈接)到下一個承諾。 沒有使用reduce
的第二個參數(初始值),因此reduce
進行的第一個回調是將第一個和第二個數組值作為參數。 因為我們希望累加器是一個承諾,而一開始顯然不是,所以將Promise.resolve
應用於累加器:
function multiply(a, b) { let c = a * b; console.log(a + " * " + b + " = " + c); return Promise.resolve(c); } function add(a, b) { let c = a + b; console.log(a + " + " + b + " = " + c); return Promise.resolve(c); } let arr = [2,3,4]; let functions = [multiply, add]; arr.reduce((acc, b, i) => Promise.resolve(acc).then(a => functions[i-1](a, b))).then(console.log);
從那時起,累加器始終是解決(中間)結果(如產品或總和)的承諾。 在reduce
回調中,您將then
鏈接到該承諾值上。 解析后,執行所需的函數( add
或multiply
),將已解析的值和數組中的下一個值傳遞給它。 then()
的結果再次是一個承諾,它將成為下一次迭代中的累加器值。
最后,打印出reduce
承諾的減少值。
您可以將Promise.resolve()
與Promise.prototype.then()
) 一起使用,如下所示:
const arr = [1, 2, 3, 4, 5, 6]; const sleep = ms => new Promise(res => setTimeout(res, ms)); const add = (a, b) => sleep(500).then(() => a + b); const multiply = (a, b) => sleep(500).then(() => a * b); arr.reduce((p, x) => p.then((y) => add(x, y)), Promise.resolve(0)).then(sum => console.log(sum)); arr.reduce((p, x) => p.then((y) => multiply(x, y)), Promise.resolve(1)).then(product => console.log(product));
這是一個接一個地調用函數的方法。
Promise.series([
new Promise(function functionMultpily(p1, p2) {
resolve( p1 * p2);
}),
new Promise(function functionADD(p1, p2) {
resolve( p1 + p2);
})
]).then(function(val){
// do any further computation here.
console.log(val);
}).catch(function(e){
console.error(e.stack);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.