Q Обещание разрешить / отклонить логику - почему обещание не возвращается как отклоненное?
Новое для обещаний, пытаясь понять логику потока. Думал, что понял, пока не начал вставлять ошибки для проверки. В приведенном ниже примере, когда я закомментирую 3-ю строку, почему Reject не возвращается в обещании?
var Q = require( "q" )
var getInstallBase = function() {
return new Promise(function(resolve, reject) {
//var IBdata = 'temp IBdata'; // <------comment out so IBdata not defined
if (IBdata){
resolve(IBdata); // State will be fulfilled
} else {
reject("error getting IBdata"); // State will be rejected
}
});
}
var mungeIt = function(IBdata){
return new Q.Promise(function(resolve,reject){
// get insight from data
console.log('IBdata = ' + IBdata);
var insight = 'temp insight';
if (insight){
resolve(insight); // State will be fulfilled
} else {
reject("error getting insight"); // State will be rejected
}
})
}
var postResults = function(insight) {
return new Promise(function(resolve, reject) {
console.log('insight = ' + insight);
// post result
var objectID = '12345';
if (objectID){
setTimeout(function() {
console.log('done waiting');
resolve(objectID);
}, 2000);
// State will be fulfilled
} else {
reject("error posting insight to object store"); // State will be rejected
}
});
};
(function extractInsightCycle() {
getInstallBase().then(mungeIt).then(postResults).then(function(objectID) {
console.log('object successfully posted, ID: ' + objectID)
extractInsightCycle();
}).catch(function(error) {
console.log('something went wrong', error);
extractInsightCycle();
})
} )();
1 ответ
Пожалуйста, проверьте этот JSBin: http://jsbin.com/zutotuvomo/edit?js,console
Он содержит упрощенную версию вашего кода, и, как вы можете видеть, обещание вернулось из getInstallBase
действительно отвергает.
Возможно, что-то еще в вашем коде заставляет его выглядеть так, как будто оно не отвергает.
РЕДАКТИРОВАТЬ:
Я еще раз взглянул на код, и вот что происходит - отклоненное обещание ловится:
function(error) {
console.log('something went wrong', error);
extractInsightCycle();
}
Который называет extractInsightCycle
это функция, которая инициирует весь процесс, и это вызывает бесконечный цикл (фактически, бесконечную рекурсию).