2016-09-24 89 views
1

这段代码等同于是Promise.all([]),相当于promise.then()。然后,()

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

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

我以为他们是等价的,但他们做的在fortunejs和mocha应用程序中表现不一样。以下是有关此应用程序的详细信息


我使用fortune.js,我想编写使用摩卡一些测试。我试图实现的是使用beforeEach挂钩来截断数据库中的表格,然后插入一些预先设定的值。所以,如果我有两个表名为customeruser我会做这样的事情

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 
    })); 
}); 

此代码并不稳定,有时,有时不工作没有我可以找到为什么(%左右50的成功率)

但是,如果我切换到该代码是工作:

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 
    })); 
}); 

我认为

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

相当于

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

由于store.delete回报的承诺,为什么我有一个不同的行为?然后

回答

2

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

开始在同一时间同时执行的承诺,并呼吁()在最新完成的,而这

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

开始与第一承诺,当这样完成执行第二个等等。

+0

Brillant!顺序不是问题,但问题是我尝试同时访问数据库两次 – ThomasThiebaud

+0

这就是all()的设计目的。您可以使用each()或map()和其他函数按顺序解析promise。 – marekful

+0

非常感谢,我会做;) – ThomasThiebaud

1

不,它们不是等效的。

The docs对于Promise.all()说明,虽然返回值是输入承诺的顺序,但它们不按该顺序解析。

链接承诺.then()解决每个承诺的顺序。

+0

订单不是问题。如果我切换订单,问题依旧。问题是'Promise.all'在数据库访问存在问题时执行诺言(请参阅@marekful答案) – ThomasThiebaud

+1

我们的答案是相同的。 _resolution_的顺序是问题。 –