2015-04-02 37 views
0

我試圖做一個解析雲代碼函數,它檢索一個「Score」,但它的級別和所有者,如果它存在,更新並創建它。 我不能讓它在一個循環內部工作,以重複更新或插入分數列表。在一個循環中解析雲代碼查詢

下面是我改編自https://parse.com/docs/js_guide#promises-chaining的代碼,它重現了我的問題。

我resultMessage輸出:

{"result":" loop loop "}

而不是

{"result":" loop set 100 find set 200 success find loopset 100 find set 200 success "}

Parse.Cloud.define("example2", function(request, response) { 
 
\t var resultMessage = "" 
 
\t var query = new Parse.Query("ScoreTest"); 
 
\t var test = ["1", "2"]; // Dumb list to loop over. 
 
\t var promise = Parse.Promise.as(); 
 
\t promise = promise.then(function() { 
 
\t \t _.each(test, function(elt) { 
 
\t \t \t resultMessage = resultMessage + " loop "; 
 
\t \t \t query.find().then(function(students) { 
 
\t \t \t \t resultMessage = resultMessage + " set 100 "; 
 
\t \t \t students[0].set("score", 100); 
 
\t \t \t return students[0].save(); 
 
\t \t \t 
 
\t \t \t }).then(function(valedictorian) { 
 
\t \t \t \t resultMessage = resultMessage + " find "; 
 
\t \t \t return query.find(); 
 
\t \t \t 
 
\t \t \t }).then(function(students) { 
 
\t \t \t \t resultMessage = resultMessage + " set 200 "; 
 
\t \t \t students[0].set("salutatorian", 200); 
 
\t \t \t return students[0].save(); 
 
\t \t \t 
 
\t \t \t }).then(function(salutatorian) { 
 
\t \t \t \t \t resultMessage = resultMessage + " success "; 
 
\t \t \t \t \t return Parse.Promise.as(); 
 
\t \t \t \t 
 
\t \t \t }); 
 
\t \t }); 
 
\t }).then(function() { 
 
\t \t response.success(resultMessage); 
 
\t }) 
 
\t 
 
});

+0

難道可以接受執行這些並行,即'環環設定100設定100找到找到set200 set200成功success'? – Bergi 2015-04-02 13:57:15

+0

請編輯問題幷包含功能目標的明確說明。文本不完整(需要對類,它們的列,列類型進行描述),需要更清楚地描述查找條件和期望結果。有時,這裏的讀者可以查看代碼來澄清問題的意圖,但發佈的代碼幾乎是不可理解的。 (我意識到這就是爲什麼你在這裏問這個問題,所以讓我們用英文說清楚,以便開始)。 – danh 2015-04-02 17:26:07

+0

@ Bergi:我不認爲我可以這樣做,因爲最終我想要檢索一個分數並使用輸入參數進行更新。如果調用是異步的,我將使用輸入表的最後一個元素的數據更新所有對象。但你可能是對的,我會看看,謝謝! – 2015-04-05 08:54:04

回答

0

也許我是在公佈的代碼引入歧途。可以說這個問題就是這樣:按照一些標準檢索一個對象。如果存在,請修改並保存。如果它不存在,請創建它。在循環中做所有的事情。

讓具有體積小,承諾返回功能做到這一點對每個邏輯位:

// return a promise for a Score matching level and owner. return 
// undefined if one doesn't exist 
function scoreWithOwnerLevel(owner, level) { 
    var query = new Parse.Query("Score"); 
    query.equalTo("owner", owner); 
    query.equalTo("level", level); 
    return query.first(); 
} 

// return a promise for either an existing score or a new one matching 
// level and owner criteria. set its otherValue 
function findOrCreateScore(owner, level, otherValue) { 
    return scoreWithOwnerLevel(owner, level).then(function(score) { 
     if (!score) { 
      var Score = Parse.Object.extend("Score"); 
      score = new Score(); 
      score.set("owner", owner); 
      score.set("level", level); 
     } 
     score.set("otherValue", param.otherValue); 
     return score; 
    }); 
} 

// take a list of owners, levels and one other value. find 
// or create scores for these based on score and level. 
// assign each the other values and save. assume that params 
// of the form [{ owner:'sam', level:2, otherValue:'foo'}, ... etc.] 
function findOrCreateScoresWith(params) { 
    var scores = _.map(params, function(param) { 
     return findOrCreateScore(param.owner, param.level, param.otherValue); 
    }); 
    return Parse.Object.saveAll(scores); 
} 
+0

不幸的是,它不適合我。首先我評論的線 'score.set( 「otherValue」,param.otherValue);' 以除去一個錯誤: **類型錯誤:對象[對象的對象]無方法 '設置' ** – 2015-04-07 17:48:08

+0

我的不好。我對第一份草稿上的某些東西感到不自在,只是無法忍受。很顯然,我們必須在找到或創建對象後更新對象。所以移動到實現查找或創造諾言。我最初建議的代碼是試圖操縱承諾,而不是對象。對不起,請參閱修改。 – danh 2015-04-07 18:37:00