所以我有一种情况需要执行一堆http调用,然后一旦完成,继续进行下一步。
以下是执行此操作且运行正常的代码。
但是,我现在需要在每次http调用之间等待几秒钟。有没有办法通过我当前的设置传递超时,还是会涉及一些重构?
如果需要,可以发布更多代码。我已经尝试将超时配置varable传递给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);
});
答案 0 :(得分:1)
您可能希望在之前成功执行顺序调用而不是使用$q.all
,而不是使用$timeout
。也许你可以建立一个递归函数。
像这样......
function performSequentialCalls (index) {
if(angular.isUndefined(array[index])) {
return;
}
getFile(array[index].id).then(function() {
$timeout(function() {
performSequentialCalls(index + 1)
}, 1000) // waiting 1 sec after each call
})
}
正确注入所需物品。这假设array
包含使用id
的对象,您可以使用它来执行API调用。还假设您使用的是$http
。如果使用$resource
,请相应地添加$promise
。
希望有所帮助!
答案 1 :(得分:0)
function getItemsWithDelay(index) {
getFile(object[index].id).then(()=>{
setTimeout(()=>{
if(index+1 > object.length) { return }
getItemsWithDelay(index+1)
}, 5000)
})
}
您可以进行连续调用
答案 2 :(得分:0)
这是一个在面试中被问到的很棒的技巧问题,反正我有类似的要求并在互联网上做了一些研究,感谢参考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 调用中发送相同的任务 - 由于关闭/上下文被切换