2017-07-29 441 views
0

所以我一直在嘗試使用Promise.all()方法,並且遇到了需要將方法傳遞給承諾數組的問題,但是我我不確定應用程序將會調用/需要多少承諾。爲Promise.all()動態地構建Promise.all()承諾數組

下面是我已經得到工作由專門建立陣列

router.post('/test1', (req, res, next) => { 
    console.log('Hit on POST /test1'); 
    let arr = ['[email protected]','[email protected]']; 
    Promise.all([ 
     lookUpUserId(arr[0]), 
     lookUpUserId(arr[1]) 
    ]).then((x)=>{res.send(x)}); 
}); 

lookUpUserId()函數返回一個承諾,我可以使用它,如果我明確的列出它們在陣列中的方法。不過,我嘗試了幾種方法來即時創建這個數組,並且我似乎無法使其工作。
實施例#1

router.post('/test1', (req,res,next) => { 
    console.log('Hit on POST /test1'); 
    let arr = ['[email protected]','[email protected]']; 
    Promise.all((arr)=>{ 
     let out = []; 
     for(let i=0; i<arr.length; i++){ 
     out.push(lookUpUserId(arr[i])); 
     } 
     return out; 
    }).then((x)=>{res.send(x)}); 
}); 

實施例2

outer.post('/test1', (req,res,next) => { 
    console.log('Hit on POST /test1'); 
    let arr = ['[email protected]','[email protected]']; 
    let promArr = (arr)=>{ 
     let out = []; 
     for(let i=0; i<arr.length; i++){ 
     out.push(lookUpUserId(arr[i])); 
     } 
    } 
    Promise.all(promArr).then((x)=>{res.send(x)}); 
}); 
+1

您已經創建了一個數組返回函數,而不是一個數組。 – Bergi

+0

我已經清除了一大堆激烈的評論。不要繼續發佈它們。 – Undo

回答

0

可以使用Array.prototype.map()哪裏lookUpUserId功能的第一參數預計的arr

router.post('/test1', (req, res, next) => { 
    console.log('Hit on POST /test1'); 
    let arr = ['[email protected]','[email protected]']; 
    Promise.all(arr.map(lookUpUserId)) 
    .then(x => res.send(x)); 
}); 

與該問題的一個要素第二種方法是你不調用函數,將數組作爲參數傳遞給功能,還是從功能

outer.post('/test1', (req,res,next) => { 
    console.log('Hit on POST /test1'); 
    let arr = ['[email protected]','[email protected]']; 
    let promArr = arr => { 
     let out = []; 
     for(let i=0; i<arr.length; i++) { 
     out.push(lookUpUserId(arr[i])); 
     } 
     return out // `return` the array of `Promise` objects 
    } 
    Promise.all(promArr(arr)).then(x => res.send(x)); 
}); 
0

這是在兩種情況下相同的問題返回out陣列....你不是實際調用的函數調用,因此你永遠傳遞數組Promise.all。

使用第二個例子,純粹是因爲它更容易表現出修復,請嘗試:

Promise.all(promAll(arr)) 
    .then(...) 
    .catch(...)