如何处理循环内的异步调用?

时间:2016-06-23 12:10:30

标签: javascript arrays angularjs for-loop arraylist

我知道这个问题已经在某种程度上得到了回答,但是我无法让我的东西运转起来。

  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]”是未定义的,因为我已经移动到数组中的最后位置。 [如果长度为20,则i = 20并且没有可用数据] 感谢帮助!

1 个答案:

答案 0 :(得分:0)

你不能在诺言中使用变量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);
        }