0

という名前のクラスをループするクラウド関数がありますdrives。このクラスの各要素には、 という名前のクラスへのポインタを持つ配列がありますdriveResults

次のようにドライブを取得するクラウド ジョブを作成しました。

まず、1 回の呼び出しで 1000 個以上のアイテムをフェッチできるように、fetchPaginated という関数を作成しました。

Parse.Collection.prototype.fetchPaginated = function(callbacks){
  var promise = new Parse.Promise();
  var result = [];
  var thisCol = this;

  var processCallback = function(res) {
    result = result.concat(res);
    if (res.length === thisCol.query._limit) {
      process(res[res.length-1].id);
    }else{
      thisCol.reset(result);
      delete thisCol.query._where.objectId;
      if(callbacks && callbacks.success)
        callbacks.success();
      promise.resolve(true);
    }
  }
  var process = function(skip) {
    if (skip) {
      thisCol.query.greaterThan("objectId", skip);
    }
    thisCol.query.ascending("objectId");
    thisCol.query.find().then(function querySuccess(res) {
      processCallback(res);
    }, function queryFailed(reason) {
      if(callbacks && callbacks.error)
        callbacks.error(thisCol, reason);
      promise.reject("query unsuccessful, length of result " + result.length + ", error:" + reason.code + " " + reason.message);
    });
  }
  process(false);

  return promise;
};

次に、ドライブのモデル、クエリ、およびコレクションを作成します。

// ---------------------------------------------------------------------------------- Drives
// --------------------------------------------------- MODEL
var DrivesModel = Parse.Object.extend({
  className: "Drives",
});
exports.DrivesModel = DrivesModel;
// --------------------------------------------------- QUERY
var DrivesQuery = new Parse.Query(DrivesModel);
exports.DrivesQuery = DrivesQuery;
DrivesQuery.limit(1000);
DrivesQuery.addAscending('date');
DrivesQuery.include('driveResults');
DrivesQuery.find({
  success: function(results) {
    // results is an array of Parse.Object.
  },

  error: function(error) {
    // error is an instance of Parse.Error.
  }
});
// --------------------------------------------------- COLLECTION
var DrivesCollection = Parse.Collection.extend({
  model: DrivesModel,
  query: DrivesQuery,
});

exports.DrivesCollection = DrivesCollection;
var drivesCollection = new DrivesCollection();
exports.drivesCollection = drivesCollection;

次に、promise 内のクラウド関数には、次のようなものがあります。

    // some initializing code here... 
    return iEVCollections.drivesCollection.fetchPaginated();
}).then(function(){
    // at this point, all drives have been fetched.
    // some code here.

ご覧のとおり、DrivesQuery には driveResults が含まれています。

問題は次のとおりです。配列 driveResuls には が含まれていますnull。コンソールに出力すると、これは配列の一部です。

[null,{"A Valid":"Object"},null,null,{"A Valid":"Object"},null,{"A Valid":"Object"},{"A Valid":"Object"},null,,null,null,{"A Valid":"Object"}]

データ ブラウザーでは、この配列の中に null がまったく含まれていないことがわかります。バックボーン アプリで同じことを行うと、有効な整数のみが含まれます。では、なぜ私のクラウド関数にこの要素が欠けているのでしょうか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

(注:質問を書いているときに解決策が思い浮かびましたが、それを削除したくありませんでした。答えはばかげているのと同じくらい簡単です)

この行DrivesQuery.limit(1000);は、ドライブのクエリの制限を 1000 に設定します。各ドライブには、少なくとも 15 個の driveResults があります。1000 の最大クエリ制限は、行によって暗示されるネストされたクエリにも適用されますDrivesQuery.include('driveResults');

ページネーション フェッチ機能のおかげで、制限を 50 に変更するだけで、すべての結果が表示され、何も表示されません。null

于 2014-09-01T16:25:33.290 に答える