首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AngularJS $q.all -在http调用之间等待

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

Stack Overflow用户
提问于 2017-08-08 17:33:35
回答 3查看 238关注 0票数 1

因此,在这种情况下,我需要执行一系列http调用,然后一旦它们完成,就继续下一步的过程。

下面是执行此操作的代码,并且运行良好。

但是,我现在需要在每个http调用之间等待几秒钟。有没有办法在我当前的设置中超时,或者它会涉及到一些很好的重构?

如果需要,可以发布更多代码。我尝试过在http调用中传入一个超时配置变量,然而,它们仍然会同时被触发。

任何建议都是很棒的。

代码

代码语言:javascript
运行
复制
 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);
 });
EN

Stack Overflow用户

发布于 2021-05-28 21:27:05

这是一个在面试中被问到的很棒的刁钻的问题,不管怎样,我也有类似的要求,并在互联网上做了一些研究,感谢参考https://codehandbook.org/understanding-settimeout-inside-for-loop-in-javascript

我能够在angularjs中延迟所有的promise调用,同样的方法也可以应用在普通的JS语法中。

我需要将任务发送到TTP API,而他们要求在每次调用中添加延迟

代码语言:javascript
运行
复制
_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调用中发送相同的任务-由于闭包/上下文被切换

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45564686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档