GVKun编程网logo

angularjs – $q.all承诺永远不会成就

24

在本文中,我们将给您介绍关于angularjs–$q.all承诺永远不会成就的详细内容,此外,我们还将为您提供关于angularjs–$q.all和嵌套的承诺、angularjs–.all()和.on

在本文中,我们将给您介绍关于angularjs – $q.all承诺永远不会成就的详细内容,此外,我们还将为您提供关于angularjs – $q.all和嵌套的承诺、angularjs – .all()和.one()在Restangular有什么区别?、angularjs – Angular $q返回承诺多个$http调用、angularjs – Angular Material不会应用样式的知识。

本文目录一览:

angularjs – $q.all承诺永远不会成就

angularjs – $q.all承诺永远不会成就

我在Feeds.forEach循环中的一个承诺最终会出错.也许是因为LoadData中的这个从不执行$rootScope.links = urls;那是在里面.怎么解决?

app.service('LoadData',['FeedService','EntryStateUrlService','$q',function(FeedService,EntryStateUrlService,$q) {
   this.loadData = function(FeedSrc) {

     FeedService.parseFeed(FeedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(data) {
       console.log(data);
       $rootScope.links = data;
     });
   }
 }
]);

app.service('FeedService',function($http,$q) {
 this.parseFeed = function(url) {
   var deferred = $q.defer();
   $http.jsonp('//ajax.googleapis.com/ajax/services/Feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url))
     .success(function(res) {

       deferred.resolve(res.data.responseData.Feed.entries);
     }).error(function() {
       deferred.reject();
     });
   return deferred.promise;
 }
});

app.service('EntryStateUrlService',['$state',function($state,$q) {

   this.getEntryStateUrl = function(Feeds) {

     var deferred = $q.defer();
     var idx = 0,promises = [],promise = null;
     Feeds.forEach(function(e) {
       promise = $http.jsonp(e.link).success(function(data) {
         /*stuff*/
        e['entryStateUrl'] = data.link; // UPDATED
         deferred.resolve(data);
       });
       promises.push(promise);

     }); //forEach
     return $q.all(promises);
   }
 }
]);

UPDATE
我真的不明白$q.all作为一个很大的承诺对象如何组合许多其他承诺将提供数据服务LoadData ….

UPDATE2

It seems like,因为一个promise失败(因为其中一个url无效)$q.all失败并且永远不会对then().怎么绕过那个?我需要从所有成功的承诺中获取所有数据.

解决方法

有一点是你需要注入$rootScope才能使用它:

app.service('LoadData','$rootScope',$q,$rootScope) {
    //...
 }
]);

同样在Q库中有一个名为allSettled的方法,即使一个失败,也可以查看所有的promise结果.角度$q没有这种方法,但有几个人发现它很有用,所以他们为它创建了扩展.以下是Github Gist上的一个示例:

angular.module('qAllSettled',[]).config(function($provide) {
  $provide.decorator('$q',function($delegate) {
    var $q = $delegate;
    $q.allSettled = function(promises) {
      return $q.all(promises.map(function(promise) {
        return promise.then(function(value) {
          return { state: 'fulfilled',value: value };
        },function(reason) {
          return { state: 'rejected',reason: reason };
        });
      }));
    };
    return $q;
  });
});

使用此方法将返回所有结果,无论是否被拒绝.返回的对象将具有一个state属性,该属性将告诉您promise的状态:

return $q.allSettled(promises);

然后,您可以检查每个承诺的状态,并根据需要将其添加到链接:

FeedService.parseFeed(FeedSrc)
    .then(EntryStateUrlService.getEntryStateUrl)
    .then(function(results) {
        $scope.links = [];
        results.forEach(function (result) {
            if (result.state === "fulfilled") {
                $scope.links.push(result.value);
            } else {
                var reason = result.reason;
            }
        });
});

Plunker Demonstration

angularjs – $q.all和嵌套的承诺

angularjs – $q.all和嵌套的承诺

在Angular中使用$q时,有一个关于同步嵌套promise的问题.
以下代码是否会确保等待整个承诺链?意味着在$q.all块中等待返回promises的服务的嵌套调用?

var call1 = service1.get('/someUr').then(function(){
  return service2.get('/someUrl2'); //returns promise
});

var call2 = service3.get('/someUr').then(function(){
  return 'hello';
});

var call3 = service4.get('/someUr').then(function(){
  return service3.get('/someUrl3');//returns promise
});

$q.all(call1,call2,call3).then(function(){
  console.log('All asynch operations are Now completed');
});

基本上:当前代码是否有可能在解决所有嵌套的promise之前执行$q.all的then?还是递归?

解决方法

是的,看起来Kevin是正确的.我还创建了一个角度快速测试来确认行为.

angular.module('myModule').controller('testController',function ($q,$scope) {

  function promiseCall(data,timeout) {
    var deferred = $q.defer();

    setTimeout(function() {
      deferred.resolve(data);
      console.log(data);
    },timeout);

    return deferred.promise;
  }

  var a = promiseCall('call1 a',1000).then(function(){
    return promiseCall('call2 a',50);
  });

  var b = promiseCall('call1 b',500);

  var c = promiseCall('call1 c',1000).then(function(){
    return promiseCall('call2 c',50).then(function(){
      return promiseCall('call3 c',6000);
    });
  });

  $q.all([a,b,c]).then(function(res){
    console.log('all calls are done');
  });

});

angularjs – .all()和.one()在Restangular有什么区别?

angularjs – .all()和.one()在Restangular有什么区别?

这两者有什么区别?两者似乎都向/ users提交GET并检索它们。
Restangular.one('users').getList().then(function(users) {
    // do something with users
});

Restangular.all('users').getList().then(function(users) {
    // do something with users
});

我知道你可以做一个(‘users’,123),它会检索/ users / 123,但没有第二个参数看起来是一样的。为什么不在这种情况下只有一个方法?

one()函数有第二个参数,它接受一个id。 .one(‘users’,1)。

> one(‘users’,1).get()转换为/ users / 1
> all(‘users’)。getList()转换为/ users

与all()不同,one()通常不与.getList()一起使用,不带参数。但是,如果你调用.one(‘users’,1).getList(’emails’)或.one(‘users’,1).all(’emails’)。getList GET请求到/ users / 1 /电子邮件。

angularjs – Angular $q返回承诺多个$http调用

angularjs – Angular $q返回承诺多个$http调用

我正在进行$http调用,它遍历多个api中的每一个并返回一个对象中的所有数据.我通常已经准备好在$http调用时解决.与此类似:
function getAllData(api) {
    return $http({
        method: 'GET',url: '/api/' + api
    })
    .then(sendResponseData)
    .catch (sendGetVolunteerError);
}

当前函数我遍历每个api并将api中的每个对象推送到一个数组中,然后将其推送到整个数组中.我有这个功能,返回一个多维数组,需要被展平.

我想在一个承诺中返回这个,但是返回undefined.这是我到目前为止的情况?有没有更好的方法来解决这个问题?

DataService的:

function getSearchData() {
    return {
        loadDataFromUrls: function () {
            var apiList = ["abo","ser","vol","con","giv","blo","par"];
            var deferred = $q.defer();
            var log = [];
            angular.forEach(apiList,function (item,key) {
                var logNew = [];
                $http({
                    method: 'GET',url: '/api/' + item
                }).then(function (response) {
                    angular.forEach(response.data,key) {
                        this.push(item);
                    },logNew);
                    return logNew;
                });
                this.push(logNew);
            },log);
            $q.all(log).then(

            function (results) {
                deferred.resolve(
                JSON.stringify(results))
            },function (errors) {
                deferred.reject(errors);
            },function (updates) {
                deferred.update(updates);
            });
            return deferred.promise;
        }
    };
};

控制器:

function getSearchData(){
  return dataService.getSearchData.loadDataFromUrls;
}  

$scope.searchData = getSearchData();
您需要$q.all和地图功能:
function getSearchData() {
    return {
        // returns a promise for an object like:
        // { abo: resultFromAbo,ser: resultFromSer,... }
        loadDataFromUrls: function () {
            var apiList = ["abo","par"];

            return $q.all(apiList.map(function (item) {
                return $http({
                    method: 'GET',url: '/api/' + item
                });
            }))
            .then(function (results) {
                var resultObj = {};
                results.forEach(function (val,i) {
                    resultObj[apiList[i]] = val.data;
                });
                return resultObj;        
            });
        }
    };
}

angularjs – Angular Material不会应用样式

angularjs – Angular Material不会应用样式

当我尝试使用Angular Material设计时遇到了问题.
它不会有任何风格.

这是我的HTML:

<!DOCTYPE html>
<html ng-app>
<head lang="en">
    <Meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

    <title>Test</title>

    <link rel="stylesheet" href="./libs/css/angular-material.css"/>

    <script src="./libs/js/angular.js"></script>
    <script src="./libs/js/angular-aria.js"></script>
    <script src="./libs/js/angular-animate.js"></script>
    <script src="./libs/js/hammer.js"></script>
    <script src="./libs/js/angular-route.js"></script>
    <script src="./libs/js/angular-resource.js"></script>
    <script src="./libs/js/angular-material.js"></script>
</head>

<body>
    <md-button>asd</md-button>
</body>
</html>

有什么我想念的吗?
angular-material.js是bower安装的文件
angular-material.css也是

解决方法

<html ng-app="app">
<head lang="en">
    <Meta name="viewport" content="width=device-width,user-scalable=no">

    <title>Test</title>

    <link rel="stylesheet" href="./libs/css/angular-material.css"/>
<link rel="stylesheet" href="./libs/themes/purple-theme.css">
            <link rel="stylesheet" href="./libs/themes/blue-grey-theme.css">
    <script src="./libs/js/angular.js"></script>
    <script src="./libs/js/angular-aria.js"></script>
    <script src="./libs/js/angular-animate.js"></script>
    <script src="./libs/js/hammer.js"></script>
    <script src="./libs/js/angular-route.js"></script>
    <script src="./libs/js/angular-resource.js"></script>
    <script src="./libs/js/angular-material.js"></script>
 <script>
 var app = angular.module('app',[

      "ngAnimate","ngSanitize","ngMaterial"
  ]);
 </script>




</head>




<body>
    <md-button>asd</md-button>
</body>
</html>

如果这不起作用,您可能有错误的路径或可能是较新的版本.要检查它,请查看angular-material文件夹.你有一个“主题”文件夹吗?新版本没有.删除较新的版本并采用早期版本.

如果您可以使用shell处理一下,可以试试这些:

bower install
bower uninstall angular-material
bower install angular-material

祝好运!

今天的关于angularjs – $q.all承诺永远不会成就的分享已经结束,谢谢您的关注,如果想了解更多关于angularjs – $q.all和嵌套的承诺、angularjs – .all()和.one()在Restangular有什么区别?、angularjs – Angular $q返回承诺多个$http调用、angularjs – Angular Material不会应用样式的相关知识,请在本站进行查询。

本文标签: