无限期地循环承诺,直到被拒绝
Loop on a promise indefinitely until rejection
我有一个函数可以执行一些异步工作并返回Promise
,我想无限期地执行此函数,直到承诺被reject
。
如下所示:
doSomethingAsync().
.then(doSomethingAsync)
.then(doSomethingAsync)
.then(doSomethingAsync)
// ... until rejection
我做了一个小CodePen,所以我可以测试潜在的解决方案:http://codepen.io/JesmoDrazik/pen/pbAovZ?editors=0011
我找到了几个可能的答案,但似乎没有什么适合我的情况。
如果有人有解决方案,我会很高兴,因为我找不到任何东西!
谢谢。
你可以做
(function loop(){
doSomethingAsync().then(loop);
})();
但是看着你的笔,不清楚拒绝应该来自哪里。如果要在用户单击按钮时停止重复操作,可以在按钮处理中更改状态,然后执行
(function loop(){
doSomethingAsync().then(function(){
if (!stopped) loop();
});
})();
对代码笔进行了修改
var FAKE_COUNT = 0;
function doSomething() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('doing something async: ' + FAKE_COUNT)
if (FAKE_COUNT < 10) {
resolve();
} else {
reject();
}
FAKE_COUNT ++;
}, 1000);
});
}
const button = document.querySelector('.js-button');
button.addEventListener('click', () => {
// maybe we can do something here ?
})
function test() {
doSomething().then(test).catch(() => {
console.log("Rejected")
});
}
test();
FAKE_COUNT只是成为标志,所以如果你想通过点击而不是计数来停止承诺,你可以把它做成一个布尔值,并在执行异步任务时检查
根据您希望逻辑和拒绝发生的位置,但假设您希望承诺本身是自执行的(否则异步执行本身可能会循环),它可以将自身作为新承诺返回:
function doSomething() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('doing something async');
resolve();
}, 1000);
}).then(()=>doSomething());
}
对于拒绝部分,最简单的方法是引入一个标志,(尽管这将使承诺不那么自包含):
var stop = false;
function doSomething() {
return new Promise((resolve, reject) => {
if(stop)
reject();
else{
setTimeout(() => {
console.log('doing something async');
resolve(); //(check for stop could be done here as well)
}, 1000);
}
}).then(()=>doSomething());
}
const button = document.querySelector('.js-button');
button.addEventListener('click', () => {
stop = true;
});
doSomething();
相关文章:
- jQuery:循环一个具有不同超时值的循环
- 在循环中分配json值时,值被覆盖
- 如何在下面的ES6循环中获得前面的文本
- 为什么“;未定义的“;在JavaScript中结束循环
- Javascript循环不会自我更新
- 如何使用jquery处理php循环通过元素
- 而循环只设置php中输入字段中的第一个值
- 循环遍历数组中的特定索引
- Javascript返回值只在循环中返回一次
- 按照选项卡索引的顺序循环一个jQuery选择
- 循环遍历以数组为值的Javascript对象
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 循环结束/推送到数组之前在页面上呈现EJS
- 循环比赛位置算法
- jQuery循环在特定位置暂停
- 在流星上使用微信js-sdk时出现拒绝权限错误
- JS拒绝循环函数
- Javascript循环拒绝执行函数
- 无限期地循环承诺,直到被拒绝