2016-04-27 12 views
1

Code:Versprechen nicht warten, bevor zu lösen nächsten dann

var x = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     console.log('x done'); 
     resolve() 
    }, 1000); 
}); 


Promise.resolve().then(x).then((resolve, reject) => { 
    console.log('all done'); 
}); 

Ausgang:

all done 
x done 

Erwartete Ausgabe:

x done 
all done 

Warum das ist Versprechen x nicht warten auf Auflösung vor dem Aufruf der nächsten then Rückruf?

JSFiddle: https://jsfiddle.net/puhbqtu0/1/

+0

'then' erwartet eine Funktion als Argument, kein Versprechen. – Bergi

+0

weil 'then()' benötigt eine Funktion als Argument, kein Versprechen. Also wird das nächste 'then' ausgeführt, nachdem x ausgeführt wurde, nicht aufgelöst. –

+1

Sie sollten 'x' in' then' zurückgeben: 'then (() => x)'. – alexmac

Antwort

4

So wie Sie verspricht in einer Serie ausführen möchten Sie x umwandeln sollte es in then zu funktionieren und rufen:

function x() { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log('x done'); 
     resolve() 
    }, 1000); 
    }); 
}); 

Promise.resolve() 
    .then(x) 
    .then(() => console.log('all done')); 

oder einfachste Variante:

x().then(() => console.log('all done')); 

jsfiddle demo

+0

Das ist wahrscheinlich ein Antipattern, das mit unbehandelten Ablehnungen enden könnte. Sie sollten keine Versprechen in eine solche Kette einbringen. – Bergi

+0

@Bergi - was schlägst du vor, Versprechen in einer Reihe zu laufen? – HyderA

+0

@Bergi bitte klären, warum es schlecht ist. – alexmac

Verwandte Themen