2015-03-23 2 views
0

Если у меня естьЧто такое различию между этими двумя синтаксисом

promise = userService.updateUser($stateParams.userId, req); 

promise.then(
    function(user) { 
     logger.logSuccess('Updated user'); 
     $scope.resetForm(); 
     WizardHandler.wizard().goTo(0); 
     return user; 
    }, 
    function(error) { 
     logger.logError('Ups an error has occurred'); 
     console.error('error updating user: ' + error); 
    } 
); 

promise.then(function(user) { 
    _.each(uploader.getNotUploadedItems(), function(item) { 
     return item.formData.push({ 
      id: user.id 
     }); 
    }); 
}); 

Тогда, если updateUser терпит неудачу журнал будет показан, а затем второй then не будет выполняться, однако, если у меня есть

promise = userService.updateUser($stateParams.userId, req).then(
    function(user) { 
     logger.logSuccess('Updated user'); 
     $scope.resetForm(); 
     WizardHandler.wizard().goTo(0); 
     return user; 
    }, 
    function(error) { 
     logger.logError('Ups an error has occurred'); 
     console.error('error updating user: ' + error); 
    } 
); 

promise.then(function(user) { 
    _.each(uploader.getNotUploadedItems(), function(item) { 
     return item.formData.push({ 
      id: user.id 
     }); 
    }); 
}); 

Второй будет выполнен

Я не могу понять, почему, я имею в виду, разве это не обычная цепочка?

ответ

2

если updateUser выходит из строя журнал будет показан, а затем второе, то не будет выполнен

Да потому, что вы ветвящимися:

   success: - logSuccessAndResetForm() 
       |  - makeNewFormData() 
updateUser() --+ 
    promise  | 
       error - logError() 

но при использовании регулярного цепная цепь второй цепи будет выполнена

Да, конечно. Ваш обработчик ошибок обрабатывает ошибка и promise выполняется с возвращаемым значением.

   success: - logSuccessAndResetForm()   success: - makeNewFormData() 
       |        \    | 
updateUser() --+        >- promise --+ 
       |        /   | 
       error - logError()   ´    error: (nothing) 

Смотрите также this answer для схем красивее управления аналогичного кода.

+0

Сноска для тех, кто пытается следовать этому: что говорит Берги, верно для местных обещаний js и большинства основных обещаний libs. Но ** будьте внимательны к обещаниям jQuery **, которые ведут себя по-разному. В jQuery обработчик ошибок. Then отмечает обещание ниже по потоку как «обработанное» *, только если * он явно возвращает отклоненное обещание. Естественное поведение заключается в распространении состояния ошибки. Таким образом, ни одна из версий кода в вопросе не срабатывает у второго обработчика успеха. Обратите также внимание на то, что люди в jQuery, скорее всего, нормализуют это поведение в какой-то момент в будущем. –

+0

@ Roamer-1888: [Это не единственная проблема] (http://stackoverflow.com/a/23744774/1048572), но на самом деле я не хочу связывать это сообщение с каждым вопросом, обозначенным обещанием. jQuery отложенные не являются надлежащими обещаниями, point :-) – Bergi

+0

Берги, я согласен, вы не можете предлагать «jQuery proviso» каждый раз. Но ваши диаграммы делают этот ответ очень ясным и убедительным - его, вероятно, прочитают многие люди. –

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