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