2017-12-18 5 views
1

Ich versuche auf array von out of loop zuzugreifen, aber es scheint etwas falsch zu sein. Was habe ich verpasst? Wie soll ich das machen?node.js Funktion gibt leer

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

Mögliche Duplikat [How gebe ich die Antwort von einem asynchronen Anruf zurück?] (https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – str

+2

'funcB' ist async . Also, Sie müssen warten (Hinweis: 'Promise.all') für all die Versprechen von' funcB' und * dann * do 'resp (array)'. –

+0

Mögliches Duplikat von [Wie man auf das Versprechen der Funktion in JavaScript wartet] (https://stackoverflow.com/questions/47773824/how-to-wait-for-functions-promise-in-javascript) – Stamos

Antwort

1

können Sie so etwas tun.

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

Wie Sie eine asynchrone Funktion in die Schleife aufrufen, müssen Sie warten, bis alle Anrufe in das Array zuzugreifen ausgeführt:

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)); 
    }); 
}