如何使response.success()等待



在下面的Cloud函数中,我需要知道将response.success()放在哪里以及如何放置,以便在所有工作完成后执行,而不是之前执行。我已经检查了函数是否按预期工作。唯一的问题是我提到的那个问题。我正在尝试使用Promises,但到目前为止我所做的并没有奏效。

 Parse.Cloud.define
 ("deleteUnitAndDependencies", function(request, response) {
    var unitListQuery;
    unitListQuery = new Parse.Query("UnitList");
    unitListQuery.equalTo("objectId", request.params.unitID);
    unitListQuery.equalTo("ownerID", request.params.userID);
    unitListQuery.find().then(function(resUnit) {
    var sentenceListQuery,sentenceListStatus;
    sentenceListQuery = new Parse.Query("SentenceList");
    sentenceListQuery.equalTo("unit", resUnit[0]);
    sentenceListStatus = sentenceListQuery.find();
    resUnit[0].destroy({});
    return sentenceListStatus;
    }).then(function(resSentence) {
    var translatListQuery,translatListQStatus;
    translatListQuery = new Parse.Query("TranslatList");
    for (iS = 0; iS < resSentence.length; iS++) {
        if (iS == 0 ) {
            translatListQuery.equalTo("sentence", resSentence[iS]);
            continue;
        }
        translatListQuery = Parse.Query.or(translatListQuery,
                                           (new Parse.Query("TranslatList")).equalTo
                                           ("sentence", resSentence[iS]));
    }
    translatListQStatus = translatListQuery.find();
    for (iS = 0; iS < resSentence.length; iS++) {
        resSentence[iS].destroy({});
    }
    return translatListQStatus;
    }).then(function(resTranslat) {
    for (iT = 0; iT < resTranslat.length; iT++) {
        resTranslat[iT].destroy({});
    }
    });
   });

将一个函数放入doSomeBigWork中,当它完成异步内容后,让它调用该函数。

doSomeBigWork(function() {
    response.success();
});

代码中有多个部分返回promise。你需要将这些包含在你的承诺链中。这就像使用return语句一样简单。

例如,此块:

    translatListQStatus = translatListQuery.find();
    for (iS = 0; iS < resSentence.length; iS++) {
        resSentence[iS].destroy({});
    }
    return translatListQStatus;
}).then(function(resTranslat) {
    for (iT = 0; iT < resTranslat.length; iT++) {
        resTranslat[iT].destroy({});
    }
});

您希望等待那些destroy调用完成。看看这部分关于并行中的Promise Chaining的帮助

    var findResults;
    translatListQStatus = translatListQuery.find()
    .then(function(resTranslat) {
        var destroyPromises = [];
        for (iS = 0; iS < resSentence.length; iS++) {
            destroyPromises.push(resSentence[iS].destroy({}));
        }
        // save these so we can return them at the end
        findResults = resTranslat;
        // return a promise here
        return Parse.Promise.when(destroyPromises);
    })
    .then(function() {
        // return the results we saved
        return findResults;
    });
    return translatListQStatus;
}).then(function(resTranslat) {
    var destroyPromises = [];
    for (iT = 0; iT < resTranslat.length; iT++) {
        destroyPromises.push(resTranslat[iT].destroy({}));
    }
    return Parse.Promise.when(destroyPromises);
});

Michel,祝贺它开始工作。对于一个仅仅使用承诺几天的人来说,这是一个不小的成就。

您会发现,通过创建destroy()实用程序,您可以避免代码重复,并直接压缩主例程。

有了这种实用性和进一步的简化/重新排列,我最终得到了这个:

Parse.Cloud.define("deleteUnitAndDependencies", function(request, response) {
    //A utility function that gets called twice
    function destroy(arr) {
        return Parse.Promise.when(arr.map(function(r) {
            return r.destroy({});
        }));
    }
    var unitListQuery = new Parse.Query("UnitList");
    unitListQuery.equalTo("objectId", request.params.unitID);
    unitListQuery.equalTo("ownerID", request.params.userID);
    unitListQuery.find().then(function(resUnit) {
        var sentenceListQuery = new Parse.Query("SentenceList");
        sentenceListQuery.equalTo("unit", resUnit[0]);
        return sentenceListQuery.find().then(function(resSentence) {
            var translatListQuery = new Parse.Query("TranslatList");
            translatListQuery.equalTo("sentence", resSentence[0]);
            for (var iS = 1; iS < resSentence.length; iS++) {//loop counter now starts at 1
                translatListQuery = Parse.Query.or(translatListQuery, (new Parse.Query("TranslatList")).equalTo("sentence", resSentence[iS]));
            }
            return translatListQuery.find().then(destroy).then(function() {
                return destroy(resSentence.concat(resUnit[0]));
            });
        });
    }).then(response.success);
});

未经测试

编辑

由于销毁似乎不需要相互等待,您应该能够执行两次.concat()技巧,并调用一次destroy()

return translatListQuery.find().then(function(resTranslat) {
    return destroy(resTranslat.concat(resSentence).concat(resUnit[0]));
});

如果有人遇到类似的问题,我会把我提出的解决方案放在这里。就我目前所检查的情况而言,它正在以我想要的方式工作。如果某位承诺专家阅读了这篇文章,并提出了改进意见和建议,请告诉我们。

Parse.Cloud.define
("deleteUnitAndDependencies", function(request, response) {
 var unitListQuery;
 unitListQuery = new Parse.Query("UnitList");
 unitListQuery.equalTo("objectId", request.params.unitID);
 unitListQuery.equalTo("ownerID", request.params.userID);
 unitListQuery.find().then
 (function(resUnit) {
  // If there is no UNIT we return an error.
  if (!resUnit.length) response.error("NO-UNIT");
  var sentenceListQuery;
  sentenceListQuery = new Parse.Query("SentenceList");
  sentenceListQuery.equalTo("unit", resUnit[0]);
  sentenceListQuery.find().then
  (function(resSentence) {
   var translatListQuery,tmpQuery;
   translatListQuery = new Parse.Query("TranslatList");
   for (iS = 0; iS < resSentence.length; iS++) {
    if (iS == 0 ) {
        translatListQuery.equalTo("sentence", resSentence[iS]);
        continue;
    }
    tmpQuery = new Parse.Query("TranslatList");
    tmpQuery.equalTo("sentence", resSentence[iS]);
    translatListQuery = Parse.Query.or(translatListQuery,tmpQuery);
   }
   translatListQuery.find().then
   (function(resTranslat) {
    var destroyPromises = [];
    for (iT = 0; iT < resTranslat.length; iT++) {
        destroyPromises.push(resTranslat[iT].destroy({}));
    }
    return Parse.Promise.when(destroyPromises);
    }).then
   (function() {
    var destroyPromises = [];
    for (iS = 0; iS < resSentence.length; iS++) {
        destroyPromises.push(resSentence[iS].destroy({}));
    }
    return Parse.Promise.when(destroyPromises);
    }).then
   (function() {
    return resUnit[0].destroy({});
    }).then(response.success);
   });
  });
 });

最新更新