在本文中,我们将给您介绍关于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和嵌套的承诺
- angularjs – .all()和.one()在Restangular有什么区别?
- angularjs – Angular $q返回承诺多个$http调用
- angularjs – Angular Material不会应用样式
angularjs – $q.all承诺永远不会成就
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().怎么绕过那个?我需要从所有成功的承诺中获取所有数据.
解决方法
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和嵌套的承诺
以下代码是否会确保等待整个承诺链?意味着在$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?还是递归?
解决方法
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有什么区别?
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(‘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调用
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();
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不会应用样式
它不会有任何风格.
这是我的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不会应用样式的相关知识,请在本站进行查询。
本文标签: