因此,在这种情况下,我需要执行一系列http调用,然后一旦它们完成,就继续下一步的过程。
下面是执行此操作的代码,并且运行良好。
但是,我现在需要在每个http调用之间等待几秒钟。有没有办法在我当前的设置中超时,或者它会涉及到一些很好的重构?
如果需要,可以发布更多代码。我尝试过在http调用中传入一个超时配置变量,然而,它们仍然会同时被触发。
任何建议都是很棒的。
代码
var allThings = array.map(function(object) {
var singleThingPromise = getFile(object.id);
return singleThingPromise;
});
$q.all(allThings).then(function() {
deferred.resolve('Finished');
}, function(error) {
deferred.reject(error);
});发布于 2021-05-28 21:27:05
这是一个在面试中被问到的很棒的刁钻的问题,不管怎样,我也有类似的要求,并在互联网上做了一些研究,感谢参考https://codehandbook.org/understanding-settimeout-inside-for-loop-in-javascript
我能够在angularjs中延迟所有的promise调用,同样的方法也可以应用在普通的JS语法中。
我需要将任务发送到TTP API,而他们要求在每次调用中添加延迟
_sendTasks: function(taskMeta) {
var defer = $q.defer();
var promiseArray = [];
const delayIncrement = 1000 * 5;
let delay = 0;
for (i = 0; i < taskMeta.length; i++) {
// using 'let' keyword is VERY IMPORTANT else 'var' will send the same task in all http calls
let requestTask = {
"action": "SOME_ACTION",
"userId": '',
"sessionId": '',
};
// new Promise can be replaced with $q - you can try that, I haven't test it although.
promiseArray.push(new Promise(() => setTimeout(() => $http.post(config.API_ROOT_URL + '/' + requestTask.action, requestTask), delay)));
delay += delayIncrement;
}
$q.all(promiseArray).
then(function(results) {
// handle the results and resolve it at the end
defer.resolve(allResponses);
})
.catch(error => {
console.log(error);
defer.reject("failed to execute");
});
return defer.promise;
}注意:在FOR循环中使用'let‘关键字非常重要,否则'var’将在所有http调用中发送相同的任务-由于闭包/上下文被切换
https://stackoverflow.com/questions/45564686
复制相似问题