AngularJS $ q.all - 在http调用之间等待

时间:2017-08-08 09:33:35

标签: javascript angularjs http settimeout

所以我有一种情况需要执行一堆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);
 });

3 个答案:

答案 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 调用中发送相同的任务 - 由于关闭/上下文被切换