【问题标题】:How to handle asynchronous calls inside looping?如何处理循环内的异步调用?
【发布时间】:2016-10-25 18:22:12
【问题描述】:

我知道这个问题已经以某种方式得到解答,但我无法让我的东西正常工作。

  YammerFunctionality.getMessagesInThread(msg.id,$scope.older_ID).then(function(response){
            var obj=response.data.messages;
            var messages=[];
            var reverseMessage=obj.reverse();
            var promises=[];
            for(var i=0;i<reverseMessage.length;i++){
                 var deferred = $q.defer();
                 promises.push(deferred.promise);
                if(reverseMessage[i].replied_to_id) {
                    YammerFunctionality.getUserInfo(reverseMessage[i].sender_id).then(function(response){
                        reverseMessage[i].sender_name=response.data.full_name;
                        messages.push(reverseMessage[i]);
                        deferred.resolve();
                    },function(error){
                        deferred.reject(error);
                    });
                }
            }
            $q.all(promises).then(function () {
                 console.info('All resolved');
                 $state.go('yammermessage',{messages:messages});
            },function(){
                showAlert("Thread error");
            });

    },function(error){
        showAlert("Yammer Error while opening Thread.");
    });

我正在尝试从特定线程获取所有消息,一旦发现我正在尝试获取相同的用户详细信息。 问题出在我获取线程并调用用户服务的 for 循环中,到执行用户服务时,索引移动到最后一个计数,因此我的代码被破坏了。

reverseMessage[i].sender_name

说“reverseMessage[i]”是未定义的,因为 i 已移动到数组中的最后一个位置。 [如果长度为 20,则 i=20 且无可用数据] 感谢您的帮助!

【问题讨论】:

  • 你说的没错“这个问题已经以某种方式得到了回答”,看看herehere
  • 我说的是 Angular 承诺。不推荐使用直接回调的方法
  • 那是你的选择,Angular 是幕后的 JavaScript,所以你可以在 JS 中想到的任何东西都可以工作。我的建议是使用闭包。

标签: javascript arrays angularjs for-loop arraylist


【解决方案1】:

你不能在你的承诺中使用变量 i。您需要创建一个闭包函数并将变量传递给该函数。试试下面的代码。

 for(var i=0;i<reverseMessage.length;i++){
             var deferred = $q.defer();
             promises.push(deferred.promise);
         function closure(i){    
            if(reverseMessage[i].replied_to_id) {
                YammerFunctionality.getUserInfo(reverseMessage[i].sender_id).then(function(response){
                   reverseMessage[i].sender_name=response.data.full_name;
                    messages.push(reverseMessage[i]);
                    deferred.resolve();
                },function(error){
                    deferred.reject(error);
                    });
                }
            }
 closure(i);
        }

【讨论】:

  • 谢谢,现在好多了.. 但是由于循环一次又一次地执行,因此根据 Yammer API 发出请求,因此这是不允许的,因此会引发错误“太多多个请求”。是否存在有什么方法可以停止循环的执行,直到内部服务完成?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2018-10-17
  • 2019-04-17
  • 2012-09-10
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多