Promise.all (). then () 해결?


96

노드 4.x 사용. 당신이이있을 때 Promise.all(promises).then()데이터를 해결하고 다음에 전달하는 적절한 방법은 무엇입니까 .then()?

다음과 같이하고 싶습니다.

Promise.all(promises).then(function(data){
  // Do something with the data here
}).then(function(data){
  // Do more stuff here
});

하지만 데이터를 2nd로 가져 오는 방법을 잘 모르겠습니다 .then(). resolve(...)처음 에는 사용할 수 없습니다 .then(). 나는 이것을 할 수 있다고 생각했다.

return Promise.all(promises).then(function(data){
  // Do something with the data here
  return data;
}).then(function(data){
  // Do more stuff here
});

하지만 그렇게하는 것이 적절한 방법이 아닌 것 같습니다. 이에 대한 올바른 접근 방식은 무엇입니까?

답변:


143

하지만 그게 적절한 방법이 아닌 것 같습니다 ..

즉 참 (또는 적어도 그것을 할 수있는 적절한 방법입니다 을 할 수있는 적절한 방법을). 이것은 프라 미스의 주요 측면이며 파이프 라인이며 파이프 라인의 다양한 핸들러가 데이터를 마사지 할 수 있습니다.

예:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("First handler", data);
    return data.map(entry => entry * 10);
  })
  .then(data => {
    console.log("Second handler", data);
  });

( catch간결성을 위해 핸들러가 생략되었습니다. 프로덕션 코드에서는 항상 promise를 전파하거나 거부를 처리합니다.)

그 결과는 다음과 같습니다.

첫 번째 핸들러 [1,2]
두 번째 핸들러 [10,20]

... 첫 번째 핸들러가 두 개의 promise ( 12) 의 해상도를 배열로 얻은 다음 각각에 10을 곱한 새 배열을 만들고 반환하기 때문입니다. 두 번째 핸들러는 첫 번째 핸들러가 반환 한 것을 가져옵니다.

추가 작업이 동기식이면 첫 번째 처리기 넣을 수도 있습니다 .

예:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("Initial data", data);
    data = data.map(entry => entry * 10);
    console.log("Updated data", data);
    return data;
  });

... 비동기 적이라면 결국 중첩되기 때문에 그렇게하고 싶지 않을 것입니다.


1
흥미 롭군. 감사합니다. 그렇다면 reject초기 Promise함수 이후의 값 은 가능하지 않습니까? 아니면 체인의 어느 곳에서나 오류를 던지면 .catch()? 그렇다면 reject애초에 요점은 무엇 입니까? 왜 그냥 오류를 던지지 않습니까? 다시 한 번 감사드립니다,
제이크 윌슨

6
@JakeWilson : 다른 질문입니다. 그러나 두 가지 별개의 사항을 혼동 하고 있습니다. 약속을 생성 하고 해결하는 것과 약속을 처리 하는 것입니다. 약속을 만들고 결정할 때 resolvereject. 을 처리 할 때 처리가 실패하면 실제로 예외를 발생시켜 실패 경로를 트리거합니다. 예, 원래 Promise콜백 에서 예외를 throw 할 수도 reject있지만 (을 사용하는 대신 ) 모든 실패가 예외 인 것은 아닙니다.
TJ Crowder


1

오늘날 NodeJS는 새로운 async/await구문을 지원 합니다. 이것은 쉬운 구문이며 삶을 훨씬 쉽게 만듭니다.

async function process(promises) { // must be an async function
    let x = await Promise.all(promises);  // now x will be an array
    x = x.map( tmp => tmp * 10);              // proccessing the data.
}

const promises = [
   new Promise(resolve => setTimeout(resolve, 0, 1)),
   new Promise(resolve => setTimeout(resolve, 0, 2))
];

process(promises)

더 알아보기:


1
프로세스에서 각 개별 Promise에 매개 변수를 어떻게 전달할 수 있습니까? @ Aminadav Glickshtein
바라 스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.