解析功能超时管理

时间:2016-01-27 16:46:59

标签: javascript parse-platform promise

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不允许在错误处理中使用链式承诺......:\

对备用解决方案的建议表示赞赏。

1 个答案:

答案 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);
});