2015-01-28 2 views
0

자체 참조하는 부모/자식 관계가 들어있는 테이블을 Parse.com의 클래스로 가져 왔습니다. 구문 분석은 이제 UID를 바꿀 새 ID를 만듭니다. 해당하는 모든 상위 ID 필드를 업데이트 할 수 없습니다.자체 참조 Parse.com 클래스

Parse.Cloud.define("updatePID", function(request, response) { 
var _results={}; 
var query = new Parse.Query("ww_notes"); 
query 
    .limit(1000) 
    .find({ 
     success: function(results){ 
      for (var i=0; i<results.length; i++){ 
       _results[results[i].get("uid")] = results[i].id; 
      }; 

      for (var i=0; i<results.length; i++){ 
       if (_results[results[i].get("pid")]){ 
        results[i].set("test", _results[results[i].get("pid")]); 
        results[i].save(); 
       }; 
      }; 
      response.success(results); 
     }, 
     error: function(){ 
      response.error("failed PID update"); 
     } 
}); 
}) 

이는 수정 된 레코드 집합을 반환하지만 데이터베이스에 저장하지 않습니다 나는 거의 관리했습니다

는 약간의 구름 코드로 가야합니다. 참고 : 테스트는 PID 업데이트로 전환하기 전에이 함수가 작동하도록하는 테스트 필드 일뿐입니다. 정적 쓰기를 첫 번째 루프로 이동하여이 문제를 단순화하려고 시도했습니다.

for (var i=0; i<results.length; i++){ 
    _results[results[i].get("uid")] = results[i].id; 
    results[i].set("test", "things"); 
    results[i].save(); 
}; 

이 부분은 245 개 레코드로 4 개 업데이트되었습니다. 되돌려 진 레코드 세트는 올바르게 업데이트되었지만 Parse 데이터 저장소는 올바르게 업데이트되지 않았습니다. 나는 245 개의 레코드 중 27 개가 업데이트되는 동일한 작업을 만들었습니다. 작업이 성공적으로 반환되었습니다.

스티븐

+0

그것은 [이 사람] (http://stackoverflow.com/questions/28089080/rate- 같은 문제를 보인다 ... (가) 저장 배치와 같은 사용의 약속입니다 제한 - 파스컴 배경 작업/28093694 # 28093694). 너무 많은 요청없이'Parse.Object.saveAll'을 사용하십시오. – eth3lbert

답변

1

당신이 겪고있는 문제는 거의 확실하게 당신이 비동기가 저장 처리하는 방법과 관련이 있습니다.

코드를 저장하는 데 몇 분 밖에 걸리지 않는 이유는 코드가 긴밀한 루프에서 비동기 적으로 실행되고 반환되기 때문입니다. 루프가 완료되는 동안 몇 가지 저장 작업을 완료 한 다음 response.을 실행하면 더 이상 작업을 수행 할 수 없습니다.

수정은

// ... 
query.limit(1000); 
query.find().then(function(results) { 
    for (var i=0; i<results.length; i++){ 
     _results[results[i].get("uid")] = results[i].id; 
    }; 

    // we'll save everything in this array 
    var toSave = []; 
    for (var i=0; i<results.length; i++){ 
     if (_results[results[i].get("pid")]){ 
      results[i].set("test", _results[results[i].get("pid")]); 
      toSave.push(results[i]); 
     }; 
    }; 
    // return a promise that's complete when everything is saved 
    return Parse.Object.saveAll(toSave); 
}).then(function(results) { 
    response.success(results); 
}, function(error) { 
    response.error(error); 
}); 
+0

환상적인 물건. 나는 비동기 호출을 고려하지 않고 오랫동안 그것을 꼼짝 않고 바라 보았다. 샘플에 대한 하나의 사소한 업데이트로, 결과를 .then 함수에 전달하여 response.success에 반환해야합니다. 건배. – stephen

+0

도움이 되니 기쁩니다. 결과물에 대한 수정 사항을 수정했습니다. 감사. – danh