2017-12-18 173 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)); 
    }); 
}