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