簡體   English   中英

用承諾處理循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM