2017-12-18 201 views
1

我試圖從不在循環中訪問array,但它似乎有些錯誤。我錯過了什麼?我應該怎麼做?node.js函數返回空

funcA(){ 
    return new Promise((resp, rej) => { 
    var list = [1,2,3,4,5]; 
    var array = []; 
    list.forEach(i => { 
     funcB(i).then(num => { 
     array.push(num); 
     console.log(array) //=> [1,2,3,4,5] 
     }) 
    }); 
    console.log(array) //=> [] 
    resp(array) //=> [] 
    }) 
} 

funcB(i){ 
    return new Promise((resp, rej) => { 
    resp(i); 
    }) 
} 
+1

的可能的複製[如何我是否會返回來自異步調用的響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – str

+2

'funcB' is async 。所以,你需要等待(提示:'Promise.all')所有'funcB'的承諾,然後*做* resp(array)'。 –

+0

[如何在JavaScript中等待函數的承諾]可能的重複(https://stackoverflow.com/questions/47773824/how-to-wait-for-functions-promise-in-javascript) – Stamos

回答

1

你可以做這樣的事情。

function funcA(){ 
 

 
    var list = [1,2,3,4,5]; 
 
    return Promise.all( 
 
    list.map(val => { 
 
     return funcB(val) 
 
    }) 
 
) 
 
    
 
} 
 

 
function funcB(i){ 
 
    return new Promise((resp, rej) => { 
 
    resp(i); 
 
    }) 
 
} 
 

 
funcA().then(arr => console.log(arr))

1

當你調用一個異步函數進入死循環,你需要等待,直到所有的調用執行訪問數組:

funcA(){ 
    return new Promise((resp, rej) => { 
    var list = [1,2,3,4,5]; 
    var promisesArray = []; 
    list.forEach(i => { 
     promisesArray.push(funcB(i)); 
    }); 
    resp(Promises.all(promisesArray)); 
    }); 
}