Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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,我试图按顺序加载一个“请求”数组,每个请求之间用延迟隔开 我使用承诺,但由于某些原因,我对并行执行而不是顺序执行的请求有问题 我写了一些测试代码如下。它起作用了!它发出请求,处理请求,超时3秒,然后转到第二个请求 var batches=[of_objects]; var sequence=Promise.resolve(); var self=这个; 序列 //为第一批创建请求 .然后(函数(){ 返回self._createRequestPromise(批[0]); }) //回调以便我们

我试图按顺序加载一个“请求”数组,每个请求之间用延迟隔开

我使用承诺,但由于某些原因,我对并行执行而不是顺序执行的请求有问题

我写了一些测试代码如下。它起作用了!它发出请求,处理请求,超时3秒,然后转到第二个请求

var batches=[of_objects];
var sequence=Promise.resolve();
var self=这个;
序列
//为第一批创建请求
.然后(函数(){
返回self._createRequestPromise(批[0]);
})
//回调以便我们可以更新,但不返回任何内容
.然后(回调)
//在下一个请求之前添加3秒超时
.然后(函数(){
返回新承诺(功能(解决、拒绝){
setTimeout(解析,3000);
});
})
//创建第二批的请求
.然后(函数(){
返回自我。_createRequestPromise(批次[1]);
})
//回调以便我们可以更新,但不返回任何内容
.然后(回调)
//在下一个请求之前添加3秒超时
.然后(函数(){
返回新承诺(功能(解决、拒绝){
setTimeout(解析,3000);
});
});

返回序列问题是您没有更新
序列
以包含任何后续操作,因此所有操作都与原始解决的承诺相链接。没有什么可以耽误他们的,所以他们马上执行

您应该能够通过更新每个循环上的
序列
变量来解决这一问题,这样您就可以链接到链的末端:

//object I need to use to construct requests
var batches = [of_objects];
var sequence = Promise.resolve();
var self = this;

batches.forEach(function (batch){
    sequence = sequence            // <-- here
        //Function returns promise
        .then( function(){
            return self._createRequestPromise(batch); //this runs first 5x
        })
        //callback so we can update, returns nothing
        .then(callback)
        //add 3 sec timeout before next request
        .then(function(){
            return new Promise(function (resolve, reject){
                setTimeout(resolve, 3000); //this runs after 5x
            });
        });
});

return sequence;

问题是,您没有更新
序列
以包含任何后续操作,因此所有操作都与原始解决的承诺相关联。没有什么可以耽误他们的,所以他们马上执行

您应该能够通过更新每个循环上的
序列
变量来解决这一问题,这样您就可以链接到链的末端:

//object I need to use to construct requests
var batches = [of_objects];
var sequence = Promise.resolve();
var self = this;

batches.forEach(function (batch){
    sequence = sequence            // <-- here
        //Function returns promise
        .then( function(){
            return self._createRequestPromise(batch); //this runs first 5x
        })
        //callback so we can update, returns nothing
        .then(callback)
        //add 3 sec timeout before next request
        .then(function(){
            return new Promise(function (resolve, reject){
                setTimeout(resolve, 3000); //this runs after 5x
            });
        });
});

return sequence;

序列编写得很好,您发出的是循环:它没有阻塞,所以所有序列都是并发执行的。这个答案可能会有帮助:序列编写得很好,您发出的是循环:它没有阻塞,所以所有序列都是并发执行的。这个答案可能会有帮助:太好了,第一个答案确实解决了我的问题!我会做更多的调查,看看到底是什么原因。也许对其他人来说,当我第一次遇到这个问题时,我实际上是从reduce函数开始的。我最初的问题是,我最后一次返回,而不是像这个答案那样被锁住。对我来说,两个答案合一:)@JeroendeLau我明白了,所以你在两次尝试中基本上犯了相同的错误。很高兴我能帮忙。:)非常感谢。在迈向promise精通的过程中,您添加了新的知识宝库;)太好了,第一个答案确实解决了我的问题!我会做更多的调查,看看到底是什么原因。也许对其他人来说,当我第一次遇到这个问题时,我实际上是从reduce函数开始的。我最初的问题是,我最后一次返回,而不是像这个答案那样被锁住。对我来说,两个答案合一:)@JeroendeLau我明白了,所以你在两次尝试中基本上犯了相同的错误。很高兴我能帮忙。:)非常感谢。在迈向promise精通的过程中,您添加了新的知识宝库;)