저는 node.js보다 최신 버전이며 비동기 API 호출에 대한 약속이 필요한 프로그램을 작성했습니다. 내 연구에서 우연히 만난 예제 코드의 실행에 관한 질문이 있습니다.Promise.all() 및 해결 시점 이해
아래의 코드는 API를 강타하여 응답을 기다린 다음 그 응답을 약속으로 해결합니다. 이것은 반복적으로 행해지 며 모든 생성 된 약속은 일련의 약속으로 전달됩니다. 결국 Promise.all()이 약속 배열에서 호출되고 .then()가 더 많은 코드가 배열을 반복하고 페이지에 이미지를 추가하기 위해 실행됩니다.
function getMovie(title) {
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
request.open('GET', 'http://mymovieapi.com/?q=' + title);
request.onload = function() {
if (request.status == 200) {
resolve(request.response); // we get the data here, so resolve the Promise
} else {
reject(Error(request.statusText)); // if status is not 200 OK, reject.
}
};
request.onerror = function() {
reject(Error("Error fetching data.")); // error occurred, so reject the Promise
};
request.send(); // send the request
});
}
function fetchMovies() {
var titles = document.getElementById('titles').value.split(',');
var promises = [];
for (var i in titles) {
promises.push(getMovie(titles[i])); // push the Promises to our array
}
Promise.all(promises).then(function(dataArr) {
dataArr.forEach(function(data) {
var img = JSON.parse(data)[0].poster.imdb;
document.getElementById('movies').innerHTML = document.getElementById('movies').innerHTML + '<img src="' + img + '"/>';
});
}).catch(function(err) {
console.log(err);
});
};
fetchMovies();
은 내가 여기에 이해 아니에요하면 API의 모든 응답이 약속에 푸시하는 Promise.all()가 대기하는 것입니다. getMovie (title)는 약속 배열에 푸시되기 전에 모든 약속을 해결하기 때문에 푸시 된 첫 번째 해결 약속이 Promise.all() 섹션을 실행하게하지 않아야합니다 (1 개의 약속 중 1 개). 배열이 해결됨)?
'Promise.all (promises)'행이 몇 번 호출 되었습니까? 그것이 발생했을 때 매개 변수 배열에 얼마나 많은 항목이 있습니까? 이 질문에 대답하면 깨달음을 얻을 수 있습니다.) – raina77ow
나는 당신이 어떤 약속을하고 있는지 오해한다고 생각합니다. promise 객체가 즉시 생성되고 closure는 thenable을 통해 다시 전달됩니다. 연쇄 호출은 동기식으로 발생하지만 결의문은 차례로 평가합니다. 모두 - 컬렉션에 추가 된 각 약속은 해결시 컬렉션 상태를 평가합니다. 모두가 해결 된 상태로 상태 전환을 해결하고 배열 내용 (첫 번째 getMedia 함수의 결과)이 전달됩니다. –
안녕 스콧, 몽구스를 이해하면 아마도이 링크가 도움이 될 것입니다 http : //stackoverflow.com/questions/39470090/node-js-detect-when-two-mongoose-find-are-finished/39471376#39471376 – vdj4y