为什么这个被拒绝的RSVP承诺没有调用catch()?

时间:2014-11-28 07:32:07

标签: ember.js promise rsvp.js

在我的Ember RSVP代码中,即使我发现我的“拒绝”错误,我也无法调用任何错误处理程序。功能正在成功执行。代码:

var promise = new Promise(function(resolve, reject) {

    doStuff().then(function() {

        resolve(1);

    }, function() {

        console.log('rejected!');
        reject('This has been rejected!');

    });

 });

var allPromises = [promise]; // Real code has more than one; just one for demonstration.

Ember.RSVP.all(allPromises)
.then(
    function() {
        console.log('I am called!');
    },
    function() { console.log('I am never called!');})
.catch(function(err) {

    console.log('I am never called, either.');

});

但是,我看到被拒绝了!'控制台中的消息。我在这做错了什么?因为reject()工作正常,所以catch()不应该开火吗?

DEBUG:Ember:1.9.0-beta.1

DEBUG:Ember数据:1.0.0-beta.12

DEBUG:jQuery:1.9.1

文档:https://github.com/tildeio/rsvp.js

他们声明'有时你可能想要同时处理许多承诺。如果将一组promises传递给all()方法,它将返回一个新的promise,当数组中的所有promise都已满足时,它将被实现;如果数组中的任何承诺被拒绝,则或立即拒绝。'

1 个答案:

答案 0 :(得分:0)

您正在捕获onReject处理程序中的错误。如果您希望catch运行,则必须提供onReject处理程序或在拒绝处理程序中抛出错误:

var promise = new Promise(function(resolve, reject) {
  reject("")
});

var allPromises = [promise];

// Alt 1 - Dont supply a onRejected handler
Ember.RSVP.all(allPromises)
    .then(function() {
        console.log('I am called!');
    }).catch(function(err) {
        console.log('I am never called, either.');
    });

// Alt 2 - Throw error in onRejected handler
Ember.RSVP.all(allPromises)
    .then(function() {
        console.log('I am called!');
    }, function () {
        console.log('I am never called!');
        throw new Error("boom");
    }).catch(function(err) {
        console.log('I am never called, either.');
    });

Alt 1将打印:
我也没有被打过电话。

Alt 2将打印:
我从来没有打过电话! 我也没有被打过电话。