2017-02-04 2 views
0

Ich habe eine einfache Versprechen:Wickel Versprechen + dann in neue Versprechen

function p(l) { 
    return new Promise(function(resolve) { 
    alert(l); 
    resolve(); 
    }); 
} 

ich dann versuchen, ein Versprechen zu erstellen, die nur zu lösen, nachdem es dann Klausel:

function pp(l1, l2) { 
    return new Promise(function(resolve) { 
    p(l1).then(() => { 
     alert(l2); 
     resolve(); 
    }); 
    }); 
} 

ich jetzt tun:

p('start').then(pp('A', 'B')).then(p('end')); 

ich erwartet hatte, um zu sehen: Start, A, B, Ende
sondern ich sehe: Start, A, Ende, B

Warum?

Wie kann ich erreichen, was ich will, ein Versprechen (pp) erstellen, das löst, wenn es dann beendet ist? versuchen

+1

'.then (() => pp ('A', 'B')) wird Ihr Problem beheben. Eine detaillierte Antwort geben. – coyotte508

+0

Dies gibt Ihnen die gewünschte Sequenz ** p ('start'). Dann (p ('A')). Dann (p ('B')). Dann (p ('End')); ** Aber wenn du ein Versprechen hast, das ** nichts ** auflöst, macht es keinen Sinn. Sie können das gleiche mit Alarm ('Start'), Alarm ('A'), Alarm ('B'), Alarm ('Ende'); Es macht wirklich keinen Sinn, ein Versprechen zu haben, das nichts auflöst. – Hosar

+0

coyotte508 - nein, das gibt mir: Start, Ende, A, B – kofifus

Antwort

0

pp können codiert werden einfacher setzen wollen:

function pp(l1, l2) { 
    return p(l1).then(() => { 
    alert(l2); 
    }); 
} 

Das ist der ganze Sinn der Versprechungen, wenn Sie komplizierte Code jedes Mal zu schreiben, ist es nicht wert :)

Auch .then den Rückgabewert des vorherigen Versprechen, eine Callback-Funktion mit in Parameter erwartet/Funktion.

p('start').then(() => pp('A', 'B')).then(() => p('end')); 

Was den genauen Grund, warum Sie Ihr Verhalten hatte, außerhalb nicht die .then Chaining mit wie es zu sein hat gemeint, ich bin nicht ganz klar, warum.

Und der Grund, dass dieser Code funktioniert, ist, weil Promise in einem Callback Promise ausgeführt wird, und der Wert, den es löst, wird an den nächsten Rückruf als Argument übergeben. () => pp('A', 'B') entspricht () => { return pp('A', 'B');}, pp wird zurückgegeben und gewartet, bevor der nächste Rückruf der Kette aufgerufen wird.

Wenn Sie die gleiche .then Aufrufsyntax halten wollen, dann pp Ändern einen Rückruf anstelle eines Promise zurückzukehren funktionieren würde:

function pp(l1, l2) { 
    return() => p(l1).then(() => { 
    alert(l2); 
    }); 
} 

Aber dann können Sie nicht verwenden, es länger als Promise. Der letzte Teil der Verkettung muss noch geändert werden: .then(() => p('end')).

+0

Danke! Das Problem dabei ist, dass es die Verantwortung auf die oberste Ebene verlagert, um pp in der richtigen Weise aufzurufen (mit() => pp ('A', 'B') ..), was ich nicht suche zum. Ich will den Top-Code, um es zu verketten, ohne zu wissen, dass es eine "dann" -Klausel hat ... Sie können Ihre Antwort ändern, um die Rückkehr() => ... innerhalb pp, dann werde ich es markieren – kofifus

+0

wie etwa: Funktion pp (l1, l2) { return() => {p (l1) .dann (() => { alert (l2); }); }}? (hinzugefügt {}) ... ist das sicher? Kann ich es dann noch als Versprechen verwenden? – kofifus

+0

@kofifus Wenn Sie '{}' hinzufügen, müssen Sie auch 'return' hinzufügen:' function pp (l1, l2) { return() => {zurück p (l1) .then (() => { alert (l2); });}; } ' – coyotte508

0

In Ihrer zweiten Funktion nach

function pp(l1, l2) { 
    return new Promise(function(resolve) { 
    alert(l1); 
    alert(l2); 
    resolve(); 
    }); 
} 

Oder wenn Sie p Funktion innerhalb pp dann

function pp(l1, l2) { 
    return p(l1).then(() => { 
    alert(l2); 
    }); 
} 



p('start').then(() => pp('A', 'B')).then(() => p('end')); 

Hier Demo https://plnkr.co/edit/fUisfcWrTu89xcc4j0cu?p=preview

0

von mdn - "onFulfilled: A Funktion aufgerufen, wenn die Verheißung erfüllt ist. Diese Funktion hat ein Argument, den Erfüllungswert."

das Problem mit meinem Code war, dass in then(pp('A', 'B')) ging ich then ein Wert (das Ergebnis pp(), das ist ein Versprechen) und keine Funktion (eine Funktion, die die Erfüllung Wert des rufenden erhält Versprechen)

So ist der richtige Weg, dann zu verwenden, ist es immer passieren eine Funktion:

function p(l) { 
 
    return new Promise(function(resolve) { 
 
    alert(l); 
 
    resolve(); 
 
    }) 
 
} 
 

 

 
function pp(l1, l2) { 
 
    return p(l1).then(() => p(l2)); 
 
} 
 

 

 
p('start').then(() => pp('A', 'B')).then(() => p('end'));

Verwandte Themen