[英]Handling loops with promises
我是處理承諾的新手,我需要遍歷它們的結果值,直到獲得所需的值:
let index = 0;
while(!flag) // loop until result inside the promise is equal to "something"
{
funcReturningPromise(index).then((result)=>{
if(result === "something"){
doSomething(result);
flag = 1; // How can I send this result back to my function so I can stop looping ?
}
index++;
});
}
我如何獲得“回調”,以便一旦有了想要的承諾就可以停止循環播放? (我知道)
提前致謝
如果您有可用的ECMAScript 2017,則可以使用異步功能來實現:
async function waitForFlag() {
let index = 0;
while(!flag) // loop until result inside the promise is equal to "something"
{
const result = await funcReturningPromise(index);
if(result === "something"){
doSomething(result);
flag = 1;
}
index++;
}
}
(顯然,然后您也可以使用break
退出循環)
就像在評論中提到的@ Occam'sRazor一樣,這是不可能的,至少要使用常規循環。
const getSomething = (index, callback) =>
funcReturningPromise(index)
.then(result =>
result === 'something' ? callback(index) : getSomething(index++, callback)
.catch(() => getSomething(index++, callback))
getSomething(0, doSomething)
HTH,寫在我頭頂上。
盡管這樣做似乎很可怕,但是由於您的應用程序可能會陷入無限循環,因此您仍然可以使用遞歸函數來實現此目的
function myfunc() {
checkTillSuccess(0);
}
function checkTillSuccess(flag) {
if(!flag) {
funcReturningPromise(index).then((result)=>{
if(result === "something"){
doSomething(result);
checkTillSuccess(1)
}
}).catch(() => {
checkTillSuccess(0)
});
}
}
正如我在評論中所述,您不能使用常規循環來執行此操作,因為常規循環是同步的,而promise不是。 您可以使用遞歸來進行一些異步“循環”。
let index = 0; (function recurse(callback) { funcReturningPromise(index).then((result) => { index++; console.log("did something with index "+index); if (index === 3){ // stop looping callback(); }else{ // keep looking recurse(callback); } }); })(function(){ // The looping has completed console.log("done looping"); }); function funcReturningPromise() { return new Promise(d => setTimeout(d, 1000)); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.