Jquery 带Q的循环暂停
我正在使用a中的Q对一些文本行()进行jQuery顺序处理。现在,我添加了一个暂停按钮来临时停止Jquery 带Q的循环暂停,jquery,promise,q,Jquery,Promise,Q,我正在使用a中的Q对一些文本行()进行jQuery顺序处理。现在,我添加了一个暂停按钮来临时停止forEach循环中的处理,但是如果我在循环中添加promise.delay(300),而-循环(见下面的部分代码)中,我的浏览器将挂起。如何使用Q在forEach循环中的布尔isPaused上实现条件暂停 var promise = new Q(); promise = promise.then(function () { lines.forEach(function (item) {
forEach
循环中的处理,但是如果我在循环中添加promise.delay(300)
,而-循环(见下面的部分代码)中,我的浏览器将挂起。如何使用Q在forEach
循环中的布尔isPaused
上实现条件暂停
var promise = new Q();
promise = promise.then(function () {
lines.forEach(function (item) {
// Browser starts to hang here if isPaused == true
promise = promise.then(function () {
while (isPaused) {
promise = promise.delay(300);
}
});
// The following does not work either
// while (isPaused) {
// promise = promise.delay(300);
//}
// The following does not work either
// while (isPaused) {
// Q.delay(300);
//}
if (item[0] == '%') {
promise = promise.then(function ()
{ return addPrompt(wnd); })
promise = promise.then(function ()
{ return addInput(item.substr(1)); })
}
else {
promise = promise.then(function ()
{ return addOutput(item, wnd); })
}
});
promise = promise.then(function ()
{ return addPrompt(wnd); })
});
promise.done();
在这种情况下,承诺仍然是异步的。while(true)
中的循环将继续执行,同时不会运行其他代码
在普通的旧浏览器JavaScript中,不能有不改变'condition'/*}
的while(condition){/*块。在您的案例中引起更改的代码永远不会有机会执行。(好吧,您可以使用ES6生成器,它让您显式地产生控制,但这里没有)
相反,您需要递归链接承诺
promise = promise.then(function pollUntil(){
return Q.delay(300).then(function(){
// recursively chain the continuation here this will check every 300 ms
// rather than freeze the code.
return isPaused ? pollUntil() : true;
});
});
这是这样的:使用PollTill继续当前操作,延迟300毫秒,然后重复(调用本身),直到isPaused不再为true
注意,您不能将.then
添加到外部承诺中,因为您(或者在更一般的情况下可能需要)稍后链接到它
当然,最好创建一个pause()
承诺,当您不再暂停时,该承诺将得到解决。在旁注中,您正在按顺序处理所有行。我想这是故意的-如果不是,请告诉我。我想它必须是Q.delay(300)
,否则它似乎会起作用。@IngeHenriksen对,Q.delay
,我习惯于承诺。ES6承诺的延迟会很快填补,我个人更喜欢蓝鸟的承诺()