2016-01-14 2 views
3

я задаюсь вопросом, почему внешний улов обратного вызова не вызывается в этом примере:Bluebird.js: Re-Бросать ошибку в поймать обратного вызова не пойман снова

var returnPromise = function() { 
    return new Promise(function (resolve, reject) { 
     resolve('promise return value'); 
    }) 
}; 
returnPromise().then(function() { 
    returnPromise().then(function() { 
     throw new Error('hello'); 
    }).catch(function (err) { 
     console.log('got inner error', err); 
     return Promise.reject(err); 
     //throw err; 
    }); 
}).catch(function (err) { 
    console.log('got outer error', err); 
}); 

Я пытался бросить пойманную ошибку снова а также вернуть отклоненное обещание, но в обоих случаях внешний обратный вызов не вызывается.

Может ли кто-нибудь сказать мне, почему?

живой пример с использованием bluebird.js 3.0.2: http://codepen.io/jjd/pen/wMqEpR?editors=001

ответ

8

отвергнутый обещание не является ошибкой. Вы можете превратить ошибку в отклоненной обещание - и это то, что вы делаете в:

.catch(function (err) { 
    return Promise.reject(err); 
}); 

и после того, что он больше не является ошибкой. Если вы хотите условие ошибки, не поймите и не отклоните.

function returnPromise() { 
    return Promise.resolve('promise return value'); 
} 

returnPromise().then(function() { 
    return returnPromise().then(function() { 
     throw new Error("failed"); 
    }) 
}).catch(function (err) { 
    console.error("Outer: " + err); 
}); 

Если ваш обработчик уловов просто выполняет некоторые операции регистрации, и вы хотите сохранить ошибку, просто снимите его.

returnPromise().then(function() { 
    return returnPromise().then(function() { 
     throw new Error("failed"); 
    }).catch(function (err) { 
     console.error("Inner: " + err); 
     throw err; // or new Error('...') 
    }); 
}).catch(function (err) { 
    console.error("Outer: " + err); 
}); 
+0

Большое спасибо за этот быстрый ответ! Оказывается, я забыл вернуть внутреннее обещание в моем примере, поэтому перехват ошибки не сработал. Вот почему я попытался вернуть отклоненное обещание, но, как вы уже сказали, это не фактическая ошибка и, следовательно, не пойман. Понял :) – Jesse

0

Спасибо @Tomalak, что я понимаю проблему сейчас. Ошибка броска внутри then() автоматически вернет Promise.reject (err) Promise.reject() внутри then() не вернет этот Promise.reject() автоматически. Мы должны вернуть Promise.reject() явно

// Caught 
Promise.resolve(10) 
    .then(() => { 
    throw new Error("hello"); // Auto return a reject promise 
    }) 
    .catch(err => { 
    console.log(err); 
    }); 

// Uncaught error 
Promise.resolve(10) 
    .then(() => { 
    Promise.reject("hello"); // Error happens => no catch happen 
    }) 
    .catch(err => { 
    console.log(err); 
    }); 

// Caught 
Promise.resolve(10) 
    .then(() => { 
    return Promise.reject("hello"); // Explicit return Promise.reject() 
    }) 
    .catch(err => { 
    console.log(err); 
    });