Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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
Jquery 带Q的循环暂停_Jquery_Promise_Q - Fatal编程技术网

Jquery 带Q的循环暂停

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) {

我正在使用a中的Q对一些文本行()进行jQuery顺序处理。现在,我添加了一个暂停按钮来临时停止
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承诺的延迟会很快填补,我个人更喜欢蓝鸟的承诺()