Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用承诺处理循环_Javascript_Promise - Fatal编程技术网

Javascript 用承诺处理循环

Javascript 用承诺处理循环,javascript,promise,Javascript,Promise,我不熟悉处理承诺,我需要循环它们的结果值,直到我得到我需要的: let index = 0; while(!flag) // loop until result inside the promise is equal to "something" { funcReturningPromise(index).then((result)=>{ if(result === "something"){ doSomething(result);

我不熟悉处理承诺,我需要循环它们的结果值,直到我得到我需要的:

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++;
    });
}
我怎样才能得到一个“回调”,这样一旦我得到我想要的承诺,我就可以停止循环?(我知道)


提前感谢

尽管这看起来是一件可怕的事情,因为您的应用程序可能会以无限循环结束,但您仍然可以使用递归函数来实现这一点

function myfunc() {
   checkTillSuccess(0);
}

function checkTillSuccess(flag) {
   if(!flag) {
      funcReturningPromise(index).then((result)=>{
        if(result === "something"){
            doSomething(result);
            checkTillSuccess(1)
        }
      }).catch(() => {
          checkTillSuccess(0)
      });
   }
}

尽管这看起来是一件可怕的事情,因为您的应用程序可能最终进入无限循环,但您仍然可以使用递归函数来实现这一点

function myfunc() {
   checkTillSuccess(0);
}

function checkTillSuccess(flag) {
   if(!flag) {
      funcReturningPromise(index).then((result)=>{
        if(result === "something"){
            doSomething(result);
            checkTillSuccess(1)
        }
      }).catch(() => {
          checkTillSuccess(0)
      });
   }
}

正如我在评论中所说的,您不能用常规循环来实现这一点,因为常规循环是同步的,而承诺不是。不过,您可以使用递归进行一些异步“循环”

let索引=0;
(函数递归(回调){
funcReturningPromise(索引)。然后((结果)=>{
索引++;
log(“使用索引做了某事”+index);
如果(索引==3){
//停止循环
回调();
}否则{
//继续找
递归(回调);
}
});
})(功能(){
//循环已完成
console.log(“完成循环”);
});
函数funcReturningPromise(){
返回新承诺(d=>setTimeout(d,1000));

}
正如我在评论中所说的,您不能用常规循环来实现这一点,因为常规循环是同步的,而承诺不是。不过,您可以使用递归进行一些异步“循环”

let索引=0;
(函数递归(回调){
funcReturningPromise(索引)。然后((结果)=>{
索引++;
log(“使用索引做了某事”+index);
如果(索引==3){
//停止循环
回调();
}否则{
//继续找
递归(回调);
}
});
})(功能(){
//循环已完成
console.log(“完成循环”);
});
函数funcReturningPromise(){
返回新承诺(d=>setTimeout(d,1000));

}
如果您有ECMAScript 2017,您可以通过以下方式实现:


(显然,您也可以使用
break
退出循环)

如果您有ECMAScript 2017可用,您可以通过以下方式实现这一点:


(显然,您也可以使用
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,我从头开始写。

就像评论中提到的@Occam'sRazor一样,这不太可能,至少使用常规循环是不可能的

const getSomething = (index, callback) => 
  funcReturningPromise(index)
    .then(result => 
      result === 'something' ? callback(index) : getSomething(index++, callback)
    .catch(() => getSomething(index++, callback))

getSomething(0, doSomething)

嗯,从我的头顶写下来。

你不能。无论如何,不使用常规循环。您的循环不会等待您承诺要执行的任何异步操作。很有可能在第一个承诺被返回之前整个循环就完成了。。。另外,正确设置代码的格式非常重要。你不能。无论如何,不使用常规循环。您的循环不会等待您承诺要执行的任何异步操作。很有可能在第一个承诺被返回之前整个循环就完成了。。。另外,正确设置代码格式非常重要。这是不完整的-
checkTillSuccess()
函数是异步的,但它本身不会返回一个
Promise
,以便调用函数可以与之同步。啊,我看到您在该函数中有
doSomething(result)
硬编码。这是一种方法,但它的“关注点分离”很差。@Alnitak,我知道它的硬编码,OP的主要关注点是其他东西,所以我强调了我的答案。这是不完整的-
checkTillSuccess()
函数是异步的,然而,它本身并没有返回一个
承诺
,以便调用函数可以与其同步。啊,我看到您在该函数中有
doSomething(result)
硬编码。这是一种方法,但它的“关注点分离”很差。@Alnitak,我知道它的硬编码,OP的主要关注点是其他东西,所以我强调了我的答案。虽然在这个特殊情况下,这是一种非常愚蠢的循环方式-你可以
让我;for(i=0;wait funcReturningPromise(i)!=“something”;i++);doSomething(“某物”):虽然在这种特殊情况下,这是一种非常愚蠢的循环方式-你可以
让我;for(i=0;wait funcReturningPromise(i)!=“something”;i++);doSomething(“某物”):D