Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能用AngularJS写下承诺_Angularjs_Angularjs Service_Q - Fatal编程技术网

我怎样才能用AngularJS写下承诺

我怎样才能用AngularJS写下承诺,angularjs,angularjs-service,q,Angularjs,Angularjs Service,Q,我正在尝试编写一个服务,它执行多个异步请求,我使用$q返回一个承诺,问题是我正在编写一些重复的代码,我想消除重复 app.factory('MyService',function($q){ var ser = { getA:function(){ var d= $q.defer; //repetitive code asyn1().then(function(){

我正在尝试编写一个服务,它执行多个异步请求,我使用$q返回一个承诺,问题是我正在编写一些重复的代码,我想消除重复

app.factory('MyService',function($q){
     var ser = {
            getA:function(){                
                var d=  $q.defer; //repetitive code
                asyn1().then(function(){
                    aync2().then(function(res){
                        //Process data
                        doSomething(res)
                        d.resolve();
                    })
                });
                return d.promise
            } ,
            getB:function(){
                var d=  $q.defer;
                asyn3().then(function(){
                    aync4().then(function(res){
                        //Process data
                        doSomething(res)
                        d.resolve();
                    })
                });
                return d.promise
            }                            
     }

     return ser;
});
在每个函数中,我都在重复
$q
这件事,如何避免重复

使用承诺链接:

getA: function() {                
    return asyn1().then(function(responseFromAsyn1) {
        return aync2(responseFromAsyn1);
    }).then(function(responseFromAsync2) {
        return postProcess(responseFromAsync2);
    });
}

getA()
现在比您原来的代码短得多,而且更正确:如果
asyn1()
async2()
失败,调用方实际上会得到一个被拒绝的承诺。

承诺的思想是编写不增加右边缩进的代码,并且处理一个叫做“回调地狱”的东西

此代码

          getA:function(){                
            var d=  $q.defer; //repetitive code
            asyn1().then(function(){
                aync2().then(function(){
                    d.resolve();
                })
            });
            return d.promise
        }
可以这样重写吗

          getA:function(){
            return async1()
              .then(async2)
              .then(processTheResultOfAsync2);
          }
或者,如果需要同步处理async1的结果

          getA:function(){
            return async1()
              .then(function(result) {
                 ..... soome synchronous processing
                 return async2(processed);
              });
          }
或者如果您需要async processinc

        getA:function(){
            return async1()
              .then(function(result) {
                 return processAsync(result)
                   .then(async2);
              });
          }
承诺会让你的生活变得更简单,如果这没有发生,你就没有正确地使用它们

我的JSFIDLE页面上的演示:


我想在aync2之后,返回之前对数据进行一些预处理。所以我想我不能忽略$qYes,你可以,通过链接承诺。我会修改我的答案。我想在第二次全国青年大会之后,返回之前对数据进行一些预处理。所以我认为我不能忽略$qreturn async1().then(async2).then(procesAsync2Result);请在代码中提供解释。查看有关如何提供好答案的详细信息。
``var module = angular.module('app', []);
    module.controller('appController', ['$scope', '$q', function($scope, $q) {

      var fibonacci = [1, 1, 2, 3, 5, 8, 13, 20];

      $scope.getItem = function(index) {
        var promise = getItemPromise(index);
        promise.then(
          function(item) {
            $scope.item = item;
            $scope.error = "";
          },
          function(error) {
            $scope.error = error;
            $scope.item = null;
          }
        );
      };

      function getItemPromise(index) {
        var item = fibonacci[index];
        var deferred = $q.defer();

        if (item)
          deferred.resolve(item);
        else
          deferred.reject("L'item n'existe pas ou l'index n'est pas valide.");

        return deferred.promise;
      }

    }]);