노드 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 ( 1
및 2
) 의 해상도를 배열로 얻은 다음 각각에 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)
더 알아보기: