2014-09-21 2 views
1

구문 분석에서 구름 코드를 실행하고 있습니다. 쿼리를 실행하고 각 쿼리에 대해 하위 쿼리를 수행하고 있습니다. 내 하위 쿼리 결과를 수정합니다. 그러나 내 하위 쿼리 개체를 수정하면 쿼리 결과 개체를 수정하여 해당 개체가 처리되었음을 나타냅니다.개체 저장시 구문 분석 콜백이 호출되지 않습니다.

약속을 사용하여 초기 쿼리를 만들고 각 결과를 반복하며 그 결과를 사용하여 하위 쿼리를 수행하고 새 하위 쿼리 결과를 수정할 수 있습니다. 그러나 일단 하위 쿼리 결과를 성공적으로 저장하면 저장 콜백이 호출되지 않고 초기 쿼리 개체를 업데이트 할 수 없습니다.

Parse.Cloud.job("processEvents", function(request, status){ 

    Parse.Cloud.useMasterKey(); 

     var query = new Parse.Query("events"); 
     query.equalTo("processed", false); 
     query.limit(10); 

     query.find().then(function(results) { 

     var promise = Parse.Promise.as(); 

     _.each(results, function(eventsRecord) { //EACH 

      var eventData = eventsRecord.get("eventData"); 
      var eventsObject = JSON.parse(eventData); 
      var events = eventsObject["events"]; 

      for (var i = 0; i < events.length; i++) { //FOR 

       var currentEvent = events[i]; 
       if(currentEvent["type"] === "vote"){ 

        var votes = currentEvent["entity"]["votes"]; 
        for (var i = 0; i < votes.length; i++) { 

         var currentVote = votes[i]; 

         promise = promise.then(function() { 

          var EventAssociationObject = Parse.Object.extend("eventAssociation"); 
          var query = new Parse.Query(EventAssociationObject); 
          query.equalTo("voteID", currentVote["id"]); 

          return query.first({ 
           success:function(object){ 

            var partyEntity = currentEvent["entity"]; 

            object.set("entityJSONInformation", JSON.stringify(partyEntity)); 

            //object in the response callback must be the object saved 
            return object.save(object, { 

             success:function(object){ 
              eventsRecord.set("processed", true); 
              return eventsRecord.save(); 
             }, 
             error: function(error){ 
              console.log(error); 
             } 
            }); 

            }, 
            error:function(error){ 
             console.log(error); 
            } 
           }); 
          }); 
        }; 

       } 


      }; //FOR 

     }); //EACH 

     return promise; 

    }).then(function() { 
     status.success("Finished"); 
    }); 

}); 
+0

당신은 약속을 코드에서 탈출하고 당신이 성공'으로 그런 일을 수행 할 때이 될해야 :'등 대신 약속을 반환 그들을 묶어 라. '성공'에서 돌아 오면 아무데도 돌아 오지 않고 약속대로하는 것처럼 비동기 적으로 기다리지 않습니다. –

+0

답글로 의견을 제출하면 받아 들일 것입니다. – ParseMan5000

+0

그래, 내가 더 명확히하고 그것을 게시했습니다. 다행히 도울 수있어. –

답변

1

당신은 약속을 코드에서 탈출하고 있습니다. 성공에서 돌아 왔을 때 : 그것은 의미있는 곳으로 돌아 오지 않고 약속과 마찬가지로 비동기 적으로 기다리지 않습니다.

대신 약속을 반환하고 연결해야합니다.

query.first({... 

query.first().then(function(result){ 
    // ... 
    return result.save(); 
}).then(function(result){ 
    eventRecords.set(... 
    return eventsRecord.save(); 
}); 

행운과 행복 코딩 :

0

Benjamin Gruenbaum의 댓글에 대한 응답으로 올바른 코드입니다. 당신은 당신이 구문 분석의 콜백 메커니즘을 사용 success:으로 그런 일을 할 때

Parse.Cloud.job("processEvents", function(request, status){ 

Parse.Cloud.useMasterKey(); 

    var query = new Parse.Query("events"); 
    query.equalTo("processed", false); 
    query.limit(10); 

    query.find().then(function(results) { 

    var promise = Parse.Promise.as(); 

    _.each(results, function(eventsRecord) { //EACH 

     var eventData = eventsRecord.get("eventData"); 
     var eventsObject = JSON.parse(eventData); 
     var events = eventsObject["events"]; 

     for (var i = 0; i < events.length; i++) { //FOR 

      var currentEvent = events[i]; 
      if(currentEvent["type"] === "vote"){ 

       var votes = currentEvent["entity"]["votes"]; 
       for (var i = 0; i < votes.length; i++) { 

        var currentVote = votes[i]; 

        promise = promise.then(function() { 

        var EventAssociationObject = Parse.Object.extend("eventAssociation"); 
        var query = new Parse.Query(EventAssociationObject); 
        query.equalTo("voteID", currentVote["id"]); 

        return query.first().then(function(object){}){ 
          var partyEntity = currentEvent["entity"]; 
          object.set("entityJSONInformation", JSON.stringify(partyEntity)); 

          //object in the response callback must be the object saved 
          return object.save().then(function(object){ 
           eventsRecord.set("processed", true); 
           return eventsRecord.save(); 
          }); 
         }); 
       }; 

      } 


     }; //FOR 

    }); //EACH 

    return promise; 

}).then(function() { 
    status.success("Finished"); 
}); 

}); 
관련 문제