2016-07-05 2 views
1

Если function uploadLogs() отклонено, я ожидаю, что отказ будет пузыриться и обрабатываться function reject(reason), но это не так. Почему нет?Почему отказ не пузырится?

Обработчик отвержения для function uploadLogs() обрабатывает отказ:

return EventCollector.persist().then(function persistResolve() { 
     return EventCollector.uploadLogs().then(function uploadLogsResolve() { 
      return closeApp(); 
     }, function rejectionHandler() { 
      console.log("this rejection handler handles the event") 
     }); 
    }, function reject(reason) { 
     return closeApp(); 
    }); 

Но если удалить обработчик отклонения и ожидать, что отказ в пузырек и обрабатываться режекциями обработчиком persist(), он почему-то Безразлично» т.

return EventCollector.persist().then(function persistResolve() { 
     return EventCollector.uploadLogs().then(function uploadLogsResolve() { 
      return closeApp(); 
     }); 
    }, function reject(reason) { 
     console.log("rejection is not handled when uploadLogs() fails"); 
     return closeApp(); 
    }); 

Не обещание цепочки и отклонения пузыря должно работать таким образом?

+0

Можете ли вы дать больше контекста, чем просто сказать не получается. функция отклонения вызывается, когда когда-либо обещание, возвращаемое из uploadLogs(), отклоняется. – M22an

ответ

1

Обработчики успеха или отклонения вызываются на основании того, были ли успешно приняты их. Но их дети вызываются внутри своих функций успеха, а это означает, что в этот момент уже принято решение о том, что родительская функция является успешной, поэтому нет причин внезапно отказываться от родительской функции, просто потому, что что-то, что делает ребенок, является сбоем.

Нет, это не должно работать так, как если бы вы заменили обещания обычной синхронной настройкой. Вы бы не ожидали, что это будет вести себя так, как вы ожидали с обещаниями, верно?

if(persist()) { 
    if(upload()) { 
    closeApp(); 
    } 
    else { 
    console.log('This would obviously not go into the below else for persist().'); 
    } 
} 
else { 
    closeApp(); 
} 

Это примерно то же поведение, что и обещание, асинхронно.

Смежные вопросы