2017-10-23 3 views
0

Warum werden diese beiden Codefragmente anders ausgegeben? In der ersten, wenn ich ausstehe, bekomme ich ausstehende Versprechen (wenn ich den tatsächlichen Wert haben möchte).Wie erwartet man den aufgelösten Wert einer ES6 Javascript async Funktion?

(() => { 
    let message = { 
    actions: [{}] 
    }; 
    message.actions = message.actions.map(async action => { 
    action.result = {}; 
    action.result.startAt = await "whatever"; 
    return action; 
    }); 

    console.log(message); 
})(); 

Und in diesem zweiten Code-Schnipsel, erhalte ich den Wert tatsächlich aufgelöst ...

(async() => { 
    let message = { 
    actions: [{}] 
    };                         
    message.actions[0].result = {}; 
    message.actions[0].result.startAt = await "whatever"; 

    console.log(message); 
})(); 
+0

Asynchron-Funktionen ein Versprechen zurück, wenn ausgeführt, ihre aufgelösten Werte sind in 'dann()' Rückrufen. Also macht Ihr erster Ausschnitt nur eine Reihe von Versprechen. Ihr zweites Snippet protokolliert einfach ein Objekt in einer asynchronen Funktion und protokolliert das Ergebnis der asynchronen Funktion nicht. –

+0

'async' wird nicht am ersten Beispiel verwendet – guest271314

+0

Richtig, aber wie kann ich die console.log vollständig auf die aufgelösten Werte warten? In meinem tatsächlichen Code ist die console.log eine Push-to-SNS-Warteschlange, und ich bekomme "Pending Promise" als Wert. – pjb

Antwort

1

Verfährt man Promise.all() oder eine for Schleife asynchron verwenden kann, um jedes Element von message.actions zu erwarten zu geben einen Promise Wert

(async() => { 
 
    let message = { 
 
    actions: [{}] 
 
    }; 
 
    message.actions = await Promise.all(message.actions.map(async(action) => { 
 
    action.result = {}; 
 
    action.result.startAt = await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 1000), "whatever")); 
 
    return action; 
 
    })); 
 

 
    console.log(message); 
 
})();

1

Erster Fall: Abschluss anfordernden Wert der Aufgabe

Sie Asynchron-Task gestartet und ohne warten (nicht sicher, warum).

Zweiter Fall:

Sie die Struktur ausfüllen und sofort drucken, damit es funktioniert.

Doch await "whatever"; ist nur "whatever"

Verwandte Themen