2017-06-16 98 views
0

我以爲我有這個承諾的事情想通了,但是這個函數從一個查詢中獲取所有結果,無論1000個項目的限制是不能正常工作。任何人都可以向我解釋我哪裏錯了嗎?謝謝!解析雲代碼承諾沒有正確返回

這個雲工作是我main.js文件:

//in main.js 
Parse.Cloud.job("testQuery", function(request, status) { 
    var theClass = Parse.Object.extend("SomeClass"); 
    var theQuery = new Parse.Query(theClass); 
    console.log("Here we go..."); 
    queryHelper.getAllResultsForQuery(theQuery, console).then(function(result) { 
    //This code is called before getAllResultsForQuery finishes 
    console.log("Finished the search!"); 
    status.success("yay"); 
    }, function(error) { 
    console.log("Fail " + error); 
    status.error("failed!"); 
    }); 
}); 

而這個功能在queryHelper.js:

//in queryHelper.js 
exports.getAllResultsForQuery = function(query, console) { 
    var resultArray = []; 
    var limit = 1000; 

    var sendQuery = function(skip) { 
    if (skip) { 
     query.greaterThan("createdAt", skip); 
    } 
    query.limit(limit); 
    query.ascending("createdAt"); 
    query.find().then(function (newResults) { 
     receivedResults(newResults); 
    }, function (error) { 
     return Parse.Promise.error(new Error("query failed after " + resultArray.length + " results, error:" + error)); 
    }); 
    }; 

    var receivedResults = function(received) { 
    resultArray = resultArray.concat(received); 
    console.log("Got " + received.length + " objects, now at " + resultArray.length); 
    if (received.length == limit) { 
     sendQuery(received[received.length-1].createdAt); 
    } else { 
     console.log("returning from getAllResults..."); 
     return resultArray; 
    } 
    }; 

    sendQuery(); 
}; 

當我運行的代碼中,queryHelper.getAllResultsForQuery功能似乎運行得很好,但Promise似乎在該功能完成之前觸發,因此控制檯輸出如下所示:

"Here we go…"; 
"Finished the search!"; 
"Got 1000 objects, now at 1000"; 
"Got 1000 objects, now at 2000"; 
"Got 1000 objects, now at 3000"; 
"Got 245 objects, now at 3245"; 
"returning from getAllResults…"; 

我在某處做菜鳥的錯誤嗎?

回答

0

getAllResultsForQuery應直接返回承諾。我標記了額外的回報。

exports.getAllResultsForQuery = function(query, console) { 
    var resultArray = []; 
    var limit = 1000; 

    var sendQuery = function(skip) { 
     if (skip) { 
      query.greaterThan("createdAt", skip); 
     } 
     query.limit(limit); 
     query.ascending("createdAt"); 
     return query.find().then(function (newResults) { //return added here 
      return receivedResults(newResults); //return added here 
     }, function (error) { 
      return Parse.Promise.error(new Error("query failed after " + 
       resultArray.length + " results, error:" + error)); 
     }); 
    }; 

    var receivedResults = function(received) { 
     resultArray = resultArray.concat(received); 
     console.log("Got " + received.length + " objects, now at " + 
      resultArray.length); 
     if (received.length == limit) { 
      return sendQuery(received[received.length-1].createdAt).then(function (received) { 
       //added code here 
       resultArray.concat(results); 
       return resultArray; 
      }); //return added here 
     } else { 
      console.log("returning from getAllResults..."); 
      return resultArray; 
     } 
    }; 
    return sendQuery(); //return added here 
}; 
+0

謝謝!我以爲我曾嘗試過,但我只是測試它。控制檯輸出現在按照正確的順序,但沒有找到結果。也許是另一個問題? – guthook

+0

@guthook哪裏沒有結果返回?通常你沒有一個全局數組,但是在內部連接並且在最後返回。 –

+0

@ neils-steenbeek查詢在receivedResults函數中返回0結果,所以控制檯讀取「獲得0個對象,現在爲0」。我嘗試切換它,所以它不使用全局數組,但仍然沒有運氣。我可能會檢查與我的Parse數據庫託管的人,看看它可能是一個服務器的錯誤。 – guthook