2017-08-01 2 views
3


Ich habe einen Anruf meiner Asynchron-Funktion innerhalb einer foreach-Schleife, wie folgt aus:
Async Funktionen wartet nicht innerhalb einer foreach-Schleife

foo { 
    list.forEach(function(field) {   
     populateValues(field); 
    }); 

    // here my list is returned incomplete 
    return list; 
} 

populateValues = async function (field) { 
    if (field.someProp === true) { 
     fields.val = await somePromise(); 
    } 
} 

somePromise = function() { 
    return new Promise(resolve => { 
     fetchMyAPIExample().then(function(value) { 
      resolve(value); 
     } 
    } 
} 

populateValues ​​() wartet richtig mein Versprechen, aber foo() Ich warte nicht auf populateValues, um die Liste zurückzugeben, daher wird meine Liste unvollständig zurückgegeben.

+1

Wie auch immer, hier ändert nichts die var 'list', also wird die Korrektur nicht ausreichen, Ihre Liste bleibt gleich. Wir haben auch einen Verweis auf 'Felder', die hier nicht deklariert werden. – Kaddath

+0

@kaddath nein, field.val = ... –

+0

@ Jonasw ich denke, das ist, was beabsichtigt war, aber das wird auch nicht wirklich helfen, als' Feld' In seinem Code ist eine Zeichenfolge mit dem Namen der Eigenschaft, nicht die Eigenschaft selbst. Aber du korrigierst alles richtig in deiner Antwort Ich denke – Kaddath

Antwort

3

Vielleicht möchten Sie auch dort erwarten, die mit forEach nicht funktioniert, aber mit for..of:

async function foo(){ 
    for(var field of list){   
    await populateValues(field); 
    } 
    return list 
} 

Oder wenn Sie wollen Rennen aktivieren: Als

function foo(){ 
    return Promise.all(
    list.map(field => populateValues(field)) 
).then(_=>list); 
} 
+0

Das ist die Antwort No.1111 ...;) –

3

, dass jeder von Die Funktion ruft populateValues ​​() auf ist async, die Funktion foo wartet nicht auf die Liste Objekt zurückgeben.

können Sie machen foo die Ergebnisse der populateValues ​​erwarten die Antwort, die Sie erwarten zu bekommen.

Verwandte Themen