在Parse Cloud Code there is a response time limit of 15s。我们在某些依赖外部服务请求的请求中遇到了问题。
如果我们有4个承诺,承诺1& 2创建对象,但如果请求在promise 3上“耗尽时间”,我们需要销毁在该进程上创建的任何内容。我以类似于以下示例的方式级联错误处理:
var obj1, obj2, obj3;
query.find().then(function() {
obj1 = new Parse.Object('Anything');
return obj1.save();
}).then(function() {
obj2 = new Parse.Object('Anything');
return obj2.save();
}).then(function _success() {
obj3 = new Parse.Object('Anything');
return obj3.save();
}).then(function _success() {
response.success();
}, function _error(err) {
var errorPromises = [];
if (obj1 != undefined) errorPromises.push(deleteExternalStuff(obj1.id));
if (obj2 != undefined) errorPromises.push(deleteExternalStuff(obj2.id));
if (obj3 != undefined) errorPromises.push(deleteExternalStuff(obj3.id));
Parse.Promise.when(errorPromises).then(function _success() {
response.error();
}, function _error() {
response.error(err);
});
});
deleteExternalStuff
函数对其中一个对象的id发出get
请求,然后返回object.destroy()
个承诺。
我的问题是get
查询有效,但destroy
内的deleteExternalStuff
承诺不会从数据库中删除对象。关于如何处理这种情况的任何建议?
修改
我已经测试过,每当发生超时时,错误都会被执行,但是destroy()
是不能正常工作的。
编辑2 为deleteExternalStuff
功能添加了类似的结构
function deleteExternalStuff(objectId) {
var query = Parse.Query('Another Object');
query.equalTo('objXXX', objectId);
return query.find().then(function _success(anotherBunchOfObjects) {
var deletePromises = _.map(anotherBunchOfObjects, function(obj) {
return obj.destroy();
});
return Parse.Promise.when(deletePromises);
}, function _error(error) {
console.log(error); // **ERROR LOG**
return Parse.Promise.as();
});
}
编辑3:
通过进一步测试,我在deleteExternalStuff
函数中添加了一个错误处理程序并打印到日志...显然**ERROR LOG**
打印出以下内容:{"code":124,"message":"Request timed out"}
这让我觉得如果你已经达到超时限制,Parse不允许在错误处理中使用链式承诺......:\
对备用解决方案的建议表示赞赏。
答案 0 :(得分:0)
要确保在请求完成之前删除所有对象,您必须等到所有承诺都得到解决:
var promises = [];
if (obj1 != undefined) promises.push(deleteExternalStuff(obj1.id));
if (obj2 != undefined) promises.push(deleteExternalStuff(obj2.id));
if (obj3 != undefined) promises.push(deleteExternalStuff(obj3.id));
Promise.all(promises).then(function() {
response.error(err);
});