2017-06-16 9 views
0

私はこの約束事を理解したと思っていましたが、1000項目の制限にかかわらずクエリからすべての結果を得るこの関数は正しく動作していません。私がどこに間違っているのか誰にでも説明できますか?ありがとう!Parse Cloud Code Promiseが正しく返されない

このクラウド仕事は私の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結果は返されません。通常、グローバル配列はありませんが、内部はconcatで、最後はリターンです。 –

+0

@ neils-steenbeekクエリはreceivedResults関数で0の結果を返します。したがって、コンソールには「0のオブジェクトがあり、現在は0」と読み込まれます。私はそれがグローバル配列を使用しないようにそれを回してみましたが、まだ運がありません。私はParseデータベースをホストしている人たちがサーバーのバグであるかどうかを確認するかもしれません。 – guthook

関連する問題