라는 배열이 previewMessages
있고 객체를 반복 messages
하고 값을 가져와야합니다. 이러한 값 중 하나는 비동기 호출이 필요하며 previewMessages
, 예를 들어 정렬을 위해 for 루프 다음에 변수 를 사용하려는 경우에는 물론 작동하지 않습니다 .
코드는 다음과 같습니다.
var displayMessages = function(messages) {
let previewMessages = [];
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {};
Promise.resolve(getItemsById([message.context.itemID])).then(function(itemInfo) {
messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
});
previewMessages.push(messageObj);
}
}
promise.all
메시지를 반복해야하고 제목을 가져 오려면 비동기 호출이 필요하기 때문에 할 수 없습니다 .
이것이 도움이된다면 위의 함수를 호출하는 첫 번째 함수가 있습니다.
var getUserMessages = function(id) {
usersRef.child(`${id}/chats/`).on('value', function(snapshot) {
displayMessages(snapshot.val());
})
}
두 가지 대안 :
비동기 호출이 병렬로 실행될 수있는 경우 (100 개가 있더라도 상관 없음) 다음 을 사용할 수 있습니다 Promise.all
.
let previewMessages = [];
let promises = [];
// Build the array of promises
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {};
previewMessages.push(messageObj);
messageObj.timeStamp = message.context.latestPost;
messageObj.user = message.context.otherUsername;
messageObj.picture = message.context.itemImageURL;
promises.push(getItemsById([message.context.itemID]).then(itemInfo => {
messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
}));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
// use previewMessages
});
그들이 경우 이 순서로, 다음을 수행하기 전에 각각 기다립니다
let previewMessages = [];
let promise = Promise.resolve();
// Loop through building up the `then` chain
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {};
previewMessages.push(messageObj);
// This one will wait for the next
promise = promise.then(() => {
messageObj.timeStamp = message.context.latestPost;
messageObj.user = message.context.otherUsername;
messageObj.picture = message.context.itemImageURL;
return getItemsById([message.context.itemID]).then(itemInfo => {
messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
});
});
}
// Wait for the last one to complete
promise.then(() => {
// Use previewMessages
});
그러나 기다릴 필요가없는 값을 채우기 위해 리터럴을 사용할 것입니다.
비동기 :
let previewMessages = [];
let promises = [];
// Build the array of promises
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {
timeStamp: message.context.latestPost,
user: message.context.otherUsername,
picture: message.context.itemImageURL
};
previewMessages.push(messageObj);
promises.push(getItemsById([message.context.itemID]).then(itemInfo => {
messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
}));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
// use previewMessages
});
동조:
let previewMessages = [];
let promise = Promise.resolve();
// Loop through building up the `then` chain
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {
timeStamp: message.context.latestPost,
user: message.context.otherUsername,
picture: message.context.itemImageURL
};
previewMessages.push(messageObj);
// This one will wait for the next
promise = promise.then(() => {
return getItemsById([message.context.itemID]).then(itemInfo => {
messageObj.title = itemInfo[Object.keys(itemInfo)[0]].title;
});
});
}
// Wait for the last one to complete
promise.then(() => {
// Use previewMessages
});
간단하고 실행 가능한 한 쌍의 예제가 도움이 될 것입니다. 또한 "... 문제는 func2가 func1에서 반환 객체를 가져 간다는 것입니다 ..."라고 언급 했으므로이를 믹스에 추가해 보겠습니다.
평행:
const messages = {
"one": {name: "Message one"},
"two": {name: "Message two"},
"three": {name: "Message three"},
"four": {name: "Message four"}
};
let previewMessages = [];
let promises = [];
// Build the array of promises
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {
name: message.name
};
previewMessages.push(messageObj);
promises.push(func1(message).then(func2).then(info => {
messageObj.info = info;
}));
}
// Wait for them all to complete
Promise.all(promises).then(() => {
// use previewMessages
console.log("Done! Result:", previewMessages);
});
function func1(message) {
return new Promise(resolve => {
// Use setTimeout for async
setTimeout(() => {
console.log("func1 resolving on " + message.name);
resolve(message.name + " - func1");
}, Math.random() * 500);
});
}
function func2(info) {
return new Promise(resolve => {
// Use setTimeout for async
setTimeout(() => {
console.log("func2 resolving on " + info);
resolve(info + " - func2");
}, Math.random() * 500);
});
}
.as-console-wrapper {
max-height: 100% !important;
}
순서:
const messages = {
"one": {name: "Message one"},
"two": {name: "Message two"},
"three": {name: "Message three"},
"four": {name: "Message four"}
};
let previewMessages = [];
let promise = Promise.resolve();
// Build the promise chain
for (let messageID in messages) {
let message = messages[messageID];
let messageObj = {
name: message.name
};
previewMessages.push(messageObj);
promise = promise.then(() => func1(message).then(func2).then(info => {
messageObj.info = info;
}));
}
// Wait for the last one to finish
promise.then(() => {
// use previewMessages
console.log("Done! Result:", previewMessages);
});
function func1(message) {
return new Promise(resolve => {
// Use setTimeout for async
setTimeout(() => {
console.log("func1 resolving on " + message.name);
resolve(message.name + " - func1");
}, Math.random() * 500);
});
}
function func2(info) {
return new Promise(resolve => {
// Use setTimeout for async
setTimeout(() => {
console.log("func2 resolving on " + info);
resolve(info + " - func2");
}, Math.random() * 500);
});
}
.as-console-wrapper {
max-height: 100% !important;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다