2016-09-24 1 views
1

나는 그들이 동등라고 생각인가 Promise.all ([]) 상당

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

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

해당하는이 코드) (다음.) (promise.then,하지만 그들은 할 fortunejs 및 mocha 응용 프로그램에서 동일하게 작동하지 않습니다. 내가 fortune.js을 사용하고 있는데 나는 모카를 사용하여 몇 가지 테스트를 작성하고 싶습니다


다음은이 응용 프로그램에 대한 자세한 내용입니다. 달성하기 위해 노력하고있어 beforeEach 후크를 사용하여 데이터베이스의 테이블을 자르고 미리 정의 된 값을 삽입하십시오. 내가 customeruser라는 두 개의 테이블이있는 경우 그래서이 코드가 안정되지 않고 찾을 수 있습니다 I 않고 때로는 때로는하지 작동이

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()) 
,536,913 나는 다른 동작을 왜

store.delete 반환 약속 때문에

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

에 해당했다?

답변

2

동시에 두 약속을 실행하기 위해이

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

가 시작되고 다음()를 호출 할 때, 최신 완성 동안이

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

처음 약속과 함께 시작하고 끝났어가 실행 두 번째 등.

+0

브릴 런트! 순서는 문제가 아니지만 문제는 데이터베이스에 동시에 두 번 액세스하려고 시도하는 것입니다. – ThomasThiebaud

+0

이것이 all()이 설계 한 것입니다. 각() 또는 map() 및 기타를 사용하여 약속을 순서대로 해결할 수 있습니다. – marekful

+0

고마워, 내가 그것을 할;) – ThomasThiebaud

1

아니요 그들은 동일하지 않습니다.

The docsPromise.all()에 대한 반환 값은 입력 약속의 순서 임에도 불구하고 그 순서로 확인되지는 않습니다.

.then()과 연쇄 약속은 각 약속을 순서대로 해결합니다.

+0

순서는 문제가되지 않습니다. 주문을 전환해도 문제는 동일하게 유지됩니다. 문제는 데이터베이스 접근에 문제가되는 시점에'Promise.all'이 약속을 이행한다는 것입니다. @marekful answer를보십시오.) – ThomasThiebaud

+1

우리의 대답은 같습니다. _resolution_의 순서가 문제입니다. –