在下面的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);
});
});
});