失败后继续承诺

时间:2014-04-03 04:35:13

标签: node.js parse-platform promise

我有一个承诺可能会失败的情况,但我希望能够处理它,然后继续下一个。我试图从失败的catch中返回一个成功的promise,但它给出了一个没有方法设置的返回对象的错误。这可能吗?我该怎么做呢?

Parse.Promise.as(1).then(function() {

    if (user.get('vendor')) {
        //fetch returns a promise
        return user.get('vendor').fetch();
    }
    return new Vendor();

}).fail(function() {
    //this will be called if the fetch fails, in that case, just return new Vendor();
    return Parse.Promise.as(function() {
        //this will be a valid promise so should hopefully return to the next then, but it doesn't work
        return new Vendor();
    });
}).then(function(result) {
    vendor = result;
    //continue with stuff
}).fail(function(error) {
    res.json(400, {
        "result": false,
        "error": error
    });
});

编辑:

我尝试将其更改为:

Parse.Promise.as(1).then(function() {

    if (user.get('vendor')) {
        return user.get('vendor').fetch();
    }
    return new Vendor();

}).then(null, function() {
    //if the fetch fails, this will return a successful Promise with Vendor object
    console.log("failed fetch");
    return new Vendor();
}).then(function(result) {
    console.log("vendor retrieved");

}).then(null, function(error) {
    console.log('error');
});

但记录: 获取失败 错误

这是Parse的做法,还是其他错误?

EDIT2:

如果我改变了

,似乎工作
return new Vendor();

行到

return Parse.Promise.as(1).then(function() { return new Vendor(); });

(编辑)或此:

return Parse.Promise.as(new Vendor());

1 个答案:

答案 0 :(得分:7)

就像你说的那样,承诺可以从异常中恢复:

try{
      mightThrow()
} catch (e){
     // handle
} 
thisWillRunRegardless();

或者使用Parse承诺:

Promise.as(1).then(function(){
    mightThrow();
}).then(null,function(e){
    // handle
}).then(function(){
    thisWillRunRegardless();
});

使用其他承诺库可能看起来像:

Promise.try(function(){
     mightThrow();
}).catch(function(){
      //handle
]).then(thisWillRunRegardless);

上述代码的问题是.fail。由于parse.com承诺是jQuery投诉 - 他们的失败方法就像jQuery一样。它添加了一个失败处理程序,返回相同的承诺

不确定他们为什么这样做,但是哦。您需要将.fail(function(){更改为.then(null,function(){...。第二个参数.then得到的是拒绝处理程序。