当前位置: 首页 > 知识库问答 >
问题:

如何使用$q在AngularJs中多次回调promise?

吉岳
2023-03-14

我使用下面的代码是为了简化后端请求,但我没有掌握如何调用成功方法或错误方法。

如何达到代码中注释的预期行为?

 
app.factory('REST', function ($http, $q, sweetAlert) {

    return {
        load: function (module, action, data) {
            var deferred = $q.defer();
            var promise = deferred.promise;         
            $http
            .post('/api/'+module+'.php?action='+action, data)
            .success(function (data) {

                if(data.error)
                {
                    sweetAlert.swal({
                        title: "Error",
                        text: data.error,
                        type: "warning"
                    });
                //HERE I WANT TO CALL .error(details)
                }
                else
                    deferred.resolve(data.result);

                        }).error(function () {
                //HERE I WANT TO CALL .error(details)
            });

            promise.success = function(fn) {
                promise.then(fn);
                return promise;
            }

            return promise;
        }
    };
});

这是使用上述代码的代码:

$scope.login = function () {
    $scope.loading = true;
    var payload = {'credentials': $scope.logindata};
    REST.load('access', 'login', payload).success(function(data) {
        if(data.redirect)
            $state.go(data.redirect);
        $scope.loading = false;
    }).error(function(data) { //THIS SHOULD BE CALLED
        $scope.loading = false;
    });
}

共有2个答案

马飞
2023-03-14

更新您的代码如下

app.factory('REST', function ($http, $q, sweetAlert) {
   return {
       load: function (module, action, data) {
              var deferred = $q.defer();                  
                  $http.post('/api/'+module+'.php?action='+action, data)
                          .success(function (data) {
                              if(data.error)
                              {
                                  sweetAlert.swal({
                                      title: "Error",
                                      text: data.error,
                                      type: "warning"
                                  });     
                                 //HERE I WANT TO CALL .error(details)                                
                                 deferred.reject(data.error);
                              }
                              else{
                                deferred.resolve(data.result);
                              }

                         })
                         .error(function (error) {
                              //HERE I WANT TO CALL .error(details)
                              deferred.reject(error);   
                          });

               return defferred.promise;
          }
   };
});

你的管制员

 $scope.login = function () {
     $scope.loading = true;
     var payload = {'credentials': $scope.logindata};
     REST.load('access', 'login', payload).then(
       function(data) {
         if(data.redirect)
             $state.go(data.redirect);
             $scope.loading = false;
       },
       function(error) {
          $scope.loading = false;
       });
   }
景翰音
2023-03-14

首先,我强烈劝阻你不要把.success附在你要回报的promise上。这是不符合/A的,它与有细微的区别。然后(由$http实现)会引起很多混乱。只是回报一个纯粹的promise。

除此之外,还需要注意以下几点:

1)您不需要另一个$q.deferdeferred.resolve()-只需链接到$超文本传输协议的原始promise,并返回结果promise。(参见延迟反模式)

2) 要拒绝promise-即导致触发.catch(而不是.error-请参见上文关于细微差别的部分)-您应该返回$q.reject()

所有这些都会产生以下结果:

app.factory('REST', function($http, $q, sweetAlert){
  return {
    load: function(module, action, data) {
      // this "return" returns the promise of $http.then
      return $http.post('/api/' + module + '.php?action=' + action, data)
        .then(function(response) {
          var data = response.data; // .then gets a response, unlike $http.success

          if (data.error) {
            sweetAlert.swal({
              title: "Error",
              text: data.error,
              type: "warning"
            });

            //HERE I WANT TO CALL .error(details)

            return $q.reject(data.error);
          }

          return data.result; // what you would have "resolved"
        });
    }
  };
})

然后,正如我上面所说的,使用。然后/。抓住,就像你对promise一样:

$scope.login = function () {
    $scope.loading = true;
    var payload = {'credentials': $scope.logindata};
    REST.load('access', 'login', payload)
        .then(function(data) {
          if(data.redirect)
             $state.go(data.redirect);
          $scope.loading = false;
        })
        .catch(function(error) {
          $scope.loading = false;
        });
}

 类似资料:
  • 问题内容: 我遇到了一个问题,我想绑定到ng-repeat循环内的函数的输出。我发现该函数每个项目被调用两次,而不是我期望的那样。这是ng- repeat部分(请注意最后的calcRowTotal()调用): calcRowTotal()函数如下所示: 接下来显示其中一个要迭代的项目的示例: 我在控制台中看到以下内容(我正在遍历的集合中当前有两项): 我当然可以做一个“ rowTotal”属性,但

  • 问题内容: 在promise库 Q中 ,您可以执行以下操作以顺序链接promise: 但是,以下命令不适用于 $ q : 问题答案: 只需使用$ q.when()函数: 注意:foo必须是工厂,例如

  • 问题内容: 我的服务是: 我通过以下方式在我的文件中调用它: 但是,它抱怨这不是一个功能。我不退还已解决的承诺吗? 问题答案: 从您的服务方式: 在您的控制器中:

  • 问题内容: 我在AngularJS的自定义服务中编写了这段小代码。 为我服务: 在我的控制器中: 我只是处理诺言中的成功和错误($ q服务)。我在许多其他服务中都需要此代码,因此我将使用自定义直接扩展$ q服务。 因此,我希望在服务中提供以下信息: 任何想法?我在Angularjs中找到了一些扩展过滤器的解释,我的问题是找到扩展$ q的所有功能并添加自定义的好方法。 我从这样的事情开始,开箱即用地

  • 问题内容: 我正在使用以下代码通过AJAX提交表单: 背景 我的PHP处理程序执行各种任务,然后发回响应。然后,我可以在成功或错误函数中执行某些操作。 我的问题 当用户双击表单的“提交”按钮时,将发生两次AJAX调用,这将导致我的PHP处理程序中的代码执行两次。 我的问题 如果用户双击提交,如何避免我的代码执行两次? 问题答案: 当AJAX调用再次出现时,请先禁用首次单击的“提交”按钮,然后重新启

  • 问题内容: 常见的情况是,在用户更新/创建一些数据后,我们需要向用户显示错误/成功消息,我们如何在AngularJS中实现它? 我想添加回调,但是找不到解决方案。使用$ http.post()。success()。error()可以工作,但是我想知道是否可以使用更高级别的API $ resource来实现。 或者,我们应该编写指令还是使用$ watch()? 感谢您的帮助。 问题答案: 就像较低级