这两种语法有什么区别

时间:2015-03-23 12:29:05

标签: javascript promise chaining

如果我有

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
        });
    });
});

然后第二个将被执行

我无法弄清楚为什么,我的意思是这不仅仅是经常链接吗?

1 个答案:

答案 0 :(得分:2)

  

如果updateUser失败,将显示日志,然后第二个将不会执行

是的,因为你正在分支:

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

但是当使用常规链接时,第二个链将被执行

是的,当然。您的错误处理程序处理错误,并使用返回值履行promise

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

另见this answer,了解类似代码的更漂亮的控制流程图。