[英]JavaScript: Recursive function with Promise, resolve returns “undefined”
[英]Javascript: Recursive function with promise and resolve when count is reached
我一直在嘗試構建一個已定義為 promise 的遞歸 function。
我無法在下面的代碼上應用遞歸模式,即使loopFor
初始化為20
,我也只循環了一次我錯過了什么?
要求: receivingMessages
必須是一個promise。
let globalMessageArray = [];
let count = 0;
let loopFor = 20;
function receivingMessages(params, loopFor, globalMessageArray) {
return new Promise((resolve, reject) => {
const command = new ReceiveMessageCommand(params);
client.send(command).then(
(data) => {
if (data && data.Messages && data.Messages.length) {
data.Messages.forEach(msg => {
globalMessageArray.push(msg);
});
};
return resolve(globalMessageArray);
},
(error) => {
return reject(error);
}).then(
(globalMessageArray) => {
count = count + 1;
console.log("Loop Count: " + count); // always returns 1
if (loopFor === 1) {
return resolve(globalMessageArray);
} else {
return resolve(receivingMessages(params, loopFor - 1, globalMessageArray));
};
});
});
};
在第一個 then 回調client.send(cmd).then(data => …
你return resolve(globalMessageArray)
。這有效地縮短了你的循環,因為 promise 只能resolve
一次。稍后調用resolve
沒有效果。
client.send(cmd).then((data) => {
…
return globalMessageArray;
}, …
Remove first call to resolve
應該可以解決您的問題。
你在評論中說:
使用 async/await 意味着重寫整個程序
不,你對 async/await 的理解是錯誤的。 任何異步 function 都會自動返回 function 的 promise,這符合您的要求。 Async/await 只是 promise 之上的語法糖。
這意味着您可以安全地重寫 ONLY receivingMessages
function 而無需修改調用它的其他地方。
盡管 vanilla promise 沒有任何問題,但重寫為 async/await 將使您的代碼更加清晰。
async function receivingMessages(params, loopFor, globalMessageArray) {
const command = new ReceiveMessageCommand(params);
const data = await client.send(command);
if (data && data.Messages && data.Messages.length) {
data.Messages.forEach(msg => {
globalMessageArray.push(msg);
});
}
if (loopFor === 1) {
return globalMessageArray;
} else {
return receivingMessages(params, loopFor - 1, globalMessageArray)
};
};
您的代碼的問題是,在 client.send promise 解析之后的 then 回調中的 resolve 調用返回調用 receivingMessages 而不是 receivingMessages promise 本身的結果。 這導致遞歸循環只執行一次。
要解決此問題,您可以更改 resolve 調用以直接返回調用 receivingMessages 的結果:
return receivingMessages(params, loopFor - 1, globalMessageArray);
這將導致 receivingMessages function 以遞歸方式被調用,直到 loopFor 達到 1。
您可能還想考慮向 function 添加基本情況以確保它終止,例如添加檢查 loopFor 是否小於或等於 0 並在這種情況下返回 globalMessageArray。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.