2016-09-24 3 views
1

Ist dieser CodeIst Promise.all ([]) entspricht promise.then(). Dann()

Promise.all([ 
    promise1, 
    promise2, 
]) 
.then(() => doSomething()) 

entspricht

promise1 
    .then(() => promise2) 
    .then(() => doSomething()) 

ich dachte, sie waren gleichwertig, aber sie tun Verhalten in einer Glücksspiel- und Mokka-Anwendung nicht. Im Folgenden finden Sie weitere Informationen zu dieser Anwendung


ich fortune.js bin mit, und ich möchte einige Tests Mokka mit schreiben. Was ich versuche zu erreichen, ist die Verwendung des beforeEach Hooks, um Tabellen in der Datenbank abzuschneiden und dann einige vordefinierte Werte einzufügen. Also, wenn ich zwei Tabellen namens customer und user werde ich etwas tun, wie diese

beforeEach(function() { 
    return Promise.all([store.delete('user'), store.delete('customer')]) 
    .then(() => store.create('customer', { 
     id: '0987654321234567890', 
     // More data 
    })) 
    .then(() => store.create('user', { 
     id: 'qwertyuioppoiuytrewq', 
     customer: '0987654321234567890', 
     // More data 
    })); 
}); 

Dieser Code ist nicht stabil und funktioniert manchmal und manchmal nicht ohne die ich finden kann, warum (rund 50% Erfolgsquote)

aber wenn ich auf diesen Code schalten es funktioniert:

beforeEach(function() { 
    return store.delete('customer') 
    .then(() => store.delete('user')) 
    .then(() => store.create('customer', { 
    id: '0987654321234567890', 
    // More data 
    })) 
    .then(() => store.create('user', { 
    id: 'qwertyuioppoiuytrewq', 
    customer: '0987654321234567890', 
    // More data 
    })); 
}); 

ich dachte, dass

Promise.all([ 
    promise1, 
    promise2, 
]) 
.then(() => doSomething()) 

entsprach

promise1 
    .then(() => promise2) 
    .then(() => doSomething()) 

Seit store.delete kehrt ein Versprechen, warum ich ein anderes Verhalten haben Sie?

Antwort

2

Diese

Promise.all([ 
    promise1, 
    promise2, 
]) 
.then(() => doSomething()) 

beginnt beide Versprechen zugleich auszuführen und ruft dann(), wenn die letzte fertig, während diese

promise1 
    .then(() => promise2) 
    .then(() => doSomething()) 

beginnt mit dem ersten Versprechen und wenn das fertig ist ausführt der zweite und so weiter.

+0

Brillant! Die Reihenfolge ist nicht das Problem, aber das Problem ist, dass ich versuche, auf die Datenbank zweimal gleichzeitig zuzugreifen – ThomasThiebaud

+0

Dafür ist all() gedacht. Sie können jedes() oder map() und andere verwenden, um Versprechen in der richtigen Reihenfolge zu lösen. – marekful

+0

Vielen Dank, ich werde es tun;) – ThomasThiebaud

1

Nein, sie sind nicht gleichwertig.

The docs für Promise.all() Zustand, obwohl der Rückgabewert die Reihenfolge der Eingabe verspricht, werden sie nicht in dieser Reihenfolge gelöst.

Verkettung Versprechen mit löst jedes Versprechen in Reihenfolge.

+0

Die Bestellung ist kein Problem. Das Problem bleibt gleich, wenn ich den Auftrag umschalte. Das Problem ist, dass "Promise.all" Versprechen zu der Zeit ausführen, die ein Problem für den Datenbankzugriff ist (siehe @marekful Antwort) – ThomasThiebaud

+1

Unsere Antworten sind die gleichen. Die Reihenfolge von _resolution_ ist das Problem. –

Verwandte Themen