2014-12-12 4 views
1

iOS에서 Parse를 사용하여 요청에서 ID를 가져오고 응답에서 숫자를받는 클라우드 코드 메소드를 실행합니다.Parse Javascript Cloud Code .save()는 단일 사용자 만 작동합니다.

클라우드 코드 기능의 목적은 요청 ID를 가져 와서 3 명의 다른 사용자의 필드에 추가하는 것입니다. 여기

자바 스크립트에서 구름 코드 방법 :

amount = 3; 
// Use Parse.Cloud.define to define as many cloud functions as you want. 
// For example: 
Parse.Cloud.define("addToIDs", function(request, response) { 

    var value = request.params.itemId; 

    var query = new Parse.Query(Parse.User); 
    query.ascending("createdAt"); 
    query.limit(100); 
    query.find({ 
    success: function(results) { 
     var sent = 0; 
     for (var i = 0; i < results.length; i++) { 
     var idlst = results[i].get("idString"); 
     if (idlst != null && idlst.indexOf(value) <= -1) { 
      idlst += value+"|"; 
      results[i].set("idString", idlst); 
      results[i].save(); 
      sent = sent+1; 
     } 
     if (sent >= amount) { 
      break; 
     } 
     } 
     response.success(sent); 
    }, 
    error: function() { 
     response.error("Test failed"); 
    } 
    }); 
}); 

내가 3 사용자를위한 .save라는 의미를 '3'의 응답을 받기 구름 코드 메소드를 실행. 문제는 내가 구문 분석 웹 사이트에서 데이터베이스 뷰어를 살펴볼 때 실제로 단일 사용자 (항상 동일한 사용자) 만 업데이트한다는 것입니다. 몇 번이나이 코드를 실행해도 실제로는 첫 번째 사용자 만 업데이트됩니다.

왜 이런 일이 일어나는 지 알고 계실 것입니다.

답변

3

savesaveAll은 비동기식이므로 저장 프로세스가 완료되었는지 확인해야합니다. 또한 사용자 개체는 소유자 또는 요청자가 masterkey으로 만 업데이트 할 수 있습니다.

다음 코드가 작동해야

var amount = 3; 
Parse.Cloud.define("addToIDs", function(request, response) { 

    var value = request.params.itemId; 

    var query = new Parse.Query(Parse.User); 
    query.ascending("createdAt"); 
    query.limit(100); 
    return query.find() 
     .then(function(results) { // success 
      var toSave = []; 
      var promise = new Parse.Promise(); 
      for (var i = 0; i < results.length; i++) { 
       var idlst = results[i].get("idString"); 
       if (idlst != null && idlst.indexOf(value) <= -1) { 
        idlst += value+"|"; 
        results[i].set("idString", idlst); 
        toSave.push(results[i]); 
       } 
       if (toSave.length >= amount) { 
        break; 
       } 
      } 
      // use saveAll to save multiple object without bursting multiple request 
      Parse.Object.saveAll(toSave, { 
       useMasterKey: true, 
       success: function(list) { 
        promise.resolve(list.length); 
       }, 
       error: function() { 
        promise.reject(); 
       } 
      }); 
      return promise;  
     }).then(function(length) { // success 
      response.success(length); 
     }, function() { // error 
      response.error("Test failed"); 
     }); 
}); 
0

이 일어나는 이유는 두 가지이다 : 저장

  1. ()
  2. 비동기 방식이며 response.success()은 즉시 내 r을 죽일 것입니다. 코드를 호출하자 마자 코드를 생성합니다.

은 그래서 일어나고있는 것은 당신의 루프는() 여러 번 저장 을 실행하고 있지만, 비동기이기 때문에, 그들은 단순히 처리 큐에 던져있어 내부에 루프를 통해에 계속있다 . 그래서 시간이의 의 한에 도달, 신속하게 처리 대기열로 저장() 년대의 전부를 던지고, 다음 당신의 response.success() 호출에 도달하지만, save() 님의 계좌 정보는 성공적으로 처리되었습니다.