[javascript] Promise.all (). then () 해결?

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

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



답변

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

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

예:

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

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


답변

귀하의 return data접근 방식이 정확합니다. 이것이 약속 체인 의 예입니다 . .then()콜백 에서 프라 미스를 반환하면 JavaScript는 해당 프라 미스를 해결하고 데이터를 다음 then()콜백으로 전달합니다 .

조심하고 .catch(). Promise.all()배열의 약속 중 하나가 거부하자마자 거부합니다 .


답변

오늘날 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)

더 알아보기:


답변