0

Parse のバックグラウンドで 1 時間ごとに実行するジョブを作成しています。私のデータベースには 2 つのテーブルがあります。1 つ目は のリストを含みQuestion、2 つ目はすべてのユーザー\質問合意ペア ( QuestionAgreement) をリストします。当初の私の計画では、クライアントにQuestionAgreements 自体をカウントさせるだけでしたが、これにより、実際にはなくすことができる多くのリクエストが発生することがわかったので、このバックグラウンド ジョブでカウントを実行してから、それと直接フィールドQuestion

これが私の試みです:

Parse.Cloud.job("updateQuestionAgreementCounts", function(request, status) {
    Parse.Cloud.useMasterKey();
    var query = new Parse.Query("Question");
    query.each(function(question) {
        var agreementQuery = new Parse.Query("QuestionAgreement");
        agreementQuery.equalTo("question", question);
        agreementQuery.count({
            success: function(count) {
                question.set("agreementCount", count);
                question.save(null, null);
            }
        });
    }).then(function() {
        status.success("Finished updating Question Agreement Counts.");
    }, function(error) {
        status.error("Failed to update Question Agreement Counts.")
    });
});

問題は、これがいくつかの でのみ実行されているように見えQuestion、その後停止し、解析ダッシュボードのジョブ ステータス セクションに「成功」​​と表示されることです。問題は、時期尚早に戻ってくることだと思います。ここに私の質問があります:

1 - これが時期尚早に戻ってこないようにするにはどうすればよいですか? (これが実際には私の問題であると仮定します。)

2 - クラウド コードをデバッグする最良の方法は何ですか? これはクライアント側ではないので、ブレークポイントなどを設定する方法がありませんね。

4

2 に答える 2

1

status.successの非同期成功呼び出しcountが完了する前に呼び出されます。これを防ぐために、ここで promise を使用できます。Parse.Query.eachのドキュメントを確認してください。

クエリの各結果を繰り返し処理し、それぞれに対してコールバックを呼び出します。コールバックが promise を返す場合、その promise が満たされるまで反復は続行されません。

したがって、count約束を連鎖させることができます:

agreementQuery.count().then(function () {
    question.set("agreementCount", count);
    question.save(null, null);
});

並列の promiseを使用して、より効率的にすることもできます。

クラウド コードにはブレークポイントがないため、Parse は非常に使いにくくなっています。唯一の方法は、変数をログに記録することですconsole.log

于 2014-11-10T03:56:53.613 に答える