是Promise.all([])等同于promise.then()。then()

时间:2016-09-24 14:08:36

标签: node.js mocha

这是代码吗

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

相当于

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

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

我正在使用fortune.js,我想使用mocha编写一些测试。我想要实现的是使用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返回Promise,为什么我会有不同的行为?

2 个答案:

答案 0 :(得分:2)

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

开始同时执行两个promise并在最后完成时调用then(),而这个

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

从第一个承诺开始,当它完成时执行第二个承诺,依此类推。

答案 1 :(得分:1)

不,他们不等同。

Promise.all()表示.then()表示虽然返回值是输入承诺的顺序,但它们不会按此顺序解析。

<div class="row" ng-controller="*protopathyUISelectCtrl as ctrl*"> <div class="form-group m-b-sm required col-md-4 col-xs-3" > <div class="input-group"> <span class="input-group-addon">test</span> <ui-select ng-model="ctrl.country.selected" theme="bootstrap" title="Choose a country" ng-disabled="disabled" append-to-body="false"> <ui-select-match placeholder="test">{{$select.selected.name}}</ui-select-match> <ui-select-choices repeat="country in ctrl.countries | filter: $select.search"> <span ng-bind-html="country.name | highlight: $select.search"></span> <small ng-bind-html="country.code | highlight: $select.search"></small> </ui-select-choices> </ui-select> </div> </div> </div> 的链接承诺按顺序解决每个承诺。