2016-07-28 6 views
0

私はpromisesとforループに問題があります。次のコードは、順次実行されていません:「2」アラートの代わりに私が直接「終了」を持って「3」と「4」のサイクルの後約束の後に実行されるjascript angular forループ

secondQuery.find().then(function(results) { 
      alert("2") 
      for (var i in results) { 
       (function(index){ 
        var object = results[index]; 
        var item_id = results[index].id; 
        var status = object.get("status"); 
        var event_id = object.get("event_id"); 
        var user_id = object.get("user_id"); 
        var user_id_name = object.get("user_id_name"); 


        var thumbimageurl = ""; 
        var nFacebookFriends = 0; 
        var nInstagramFollowers = 0; 
        var nTwitterFollowers = 0; 

        var query2 = new Parse.Query(User) 
        query2.equalTo("username",user_id) 
        return query2.first({ 
         success: function(object) { 
          alert("3") 
          var thumbfile = object.get("thumb"); 
          thumbimageurl = thumbfile.url(); 
          nFacebookFriends = object.get('nFacebookFriends'); 
          nInstagramFollowers = object.get('nInstagramFollowers'); 
          nTwitterFollowers = object.get('nTwitterFollowers'); 
         } 
        }).then(function(){ 
         alert("4") 
         requests.push({ 
          'thumb': thumbimageurl, 
          'item_id':item_id, 
          'status':status, 
          'event_id':event_id, 
          'user_id':user_id, 
          'user_id_name':user_id_name, 
          'nFacebookFriends':nFacebookFriends, 
          'nInstagramFollowers':nInstagramFollowers, 
          'nTwitterFollowers':nTwitterFollowers 
         }) 
        }) 
       })(i) 
      } 
     }).then(function(){ 
        alert('end') 
         $scope.requests = requests; 
         $localStorage.requests = requests; 
         // alert(JSON.stringify(requests)) 
     }) 

を。次の約束の前にforループを強制的に実行する方法はありますか?

答えて

0

非同期呼び出しがどのように起こるかを理解する必要があります。ここでは最も外側のブロック(secondQuery.find().then...)が実行され、約束が返されると、コールバックが同期的に実行され(ループのすべての反復で異なる非同期呼び出しが発生する)、終了してalert('end')を含むthenブロックを実行します;あなたのコードでは、私はquery2.firstが非同期呼び出しであることを観察しているので、endブロックが呼び出される前には返されてはなりません。

34の後ろにendブロックが来るようにするには、そのブロックにチェーンする必要があります。それがあなたが望むシーケンスを保証する唯一の方法です。またはpromise.all()(図書館がブルーバードを使用している場合)またはpromise.all()(es6)

0

あなたは約束を結びつけることができます。 forループの繰り返しのたびに、promise chainpromisesを追加し続けることができます。

注:しかし、私は@query2.firstという問題を抱えています。これは約束を返し、またコールバックを返しますか?その場合、私はコールバックの部分で何が起こるか知りません。

secondQuery.find().then(function(results) { 
    alert("2"); 

    // We will create a chain of promises here, 
    // Each of it is pending on previouse promise in the chain 
    var promise = Promise.resolve(); 

    for (var i in results) { 
     (function(index) {      
      promise = promise.then(function() {      
       var object = results[index]; 
       var item_id = results[index].id; 
       var status = object.get("status"); 
       var event_id = object.get("event_id"); 
       var user_id = object.get("user_id"); 
       var user_id_name = object.get("user_id_name"); 


       var thumbimageurl = ""; 
       var nFacebookFriends = 0; 
       var nInstagramFollowers = 0; 
       var nTwitterFollowers = 0; 

       var query2 = new Parse.Query(User); 
       query2.equalTo("username",user_id); 

       //I am not very sure about this, this return a promise also there is a callback 
       //So When callback hits is out of this scope 
       return query2.first({ 
        success: function(object) { 
         alert("3") 
         var thumbfile = object.get("thumb"); 
         thumbimageurl = thumbfile.url(); 
         nFacebookFriends = object.get('nFacebookFriends'); 
         nInstagramFollowers = object.get('nInstagramFollowers'); 
         nTwitterFollowers = object.get('nTwitterFollowers'); 
        } 
       }) 
      }) 
      .then(function() { 
       alert("4"); 
       requests.push({ 
        'thumb': thumbimageurl, 
        'item_id':item_id, 
        'status':status, 
        'event_id':event_id, 
        'user_id':user_id, 
        'user_id_name':user_id_name, 
        'nFacebookFriends':nFacebookFriends, 
        'nInstagramFollowers':nInstagramFollowers, 
        'nTwitterFollowers':nTwitterFollowers 
       }) 
      }) 
     })(i) 
    } 

    return promise; 
}) 
.then(function(){ 
    alert('end'); 
    $scope.requests = requests; 
    $localStorage.requests = requests; 
    // alert(JSON.stringify(requests)) 
}) 
関連する問題