簡體   English   中英

如何在javascript中使用reduce函數調用promise中的函數

[英]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鏈接到該承諾值上。 解析后,執行所需的函數( addmultiply ),將已解析的值和數組中的下一個值傳遞給它。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM