如何将简单的$http与回调转换为使用承诺
How to convert simple $http with callback to use promises
我正在尝试理解angular中的promises,我有一个下面的例子,我想把它转换成使用promises,希望它能帮助我"啊哈!"
我在网上找到的所有例子都是使用服务/工厂等,我只是想知道最好的方法让这样简单的东西使用承诺。
angular.module('web').controller('CardsCtrl',function($scope, $http, $q){
// Don't worry about how the variable "users" gets populated, let's just say it came into magical existance from a unicorn's horn.
$scope.users = users;
// Loop through all the users
for(var i = 0; i < $scope.users .length; i++) {
// THIS FAILS BECAUSE THE LOOP FINISHES BEFORE THE 1ST GET REQUEST FINISHES SO WE CAN'T REFERENCE THE I VARIABLE
$http.get('http://uifaces.com/api/v1/random', function(face) {
$scope.users[i].face = face.image_urls.mini;
});
}
});
你所拥有的不是承诺的问题。这只是典型的"循环闭包"问题。
修改如下:
for(var i = 0; i < $scope.users .length; i++) {
(function(i) {
$http.get('http://uifaces.com/api/v1/random', function(face) {
$scope.users[i].face = face.image_urls.mini;
});
}(i));
}
我是这样写的:
$q.all($scope.users.map(function(user){
return $http.get('http://uifaces.com/api/v1/random').then(function(face){
return user.face = face.image_urls.mini;
});
})).then(function(results) {
// results contains the images actually used, so you can use it here too
});
相关文章:
- 将json回调数据转换为日期
- Facebook转换事件回调
- 使用回调hell将构建转换为promise hell
- 如何将此异步回调转换为生成器
- 在nodejs中将回调转换为promise
- 如何重构“;回调金字塔”;转换为基于承诺的版本
- 触发CSS转换,使用来自Javascript的样式,从内部指令完成回调
- Ember.js从回调转换后
- 无法将 NeDB 节点回调转换为 Bacon EventStream
- 在转换结束时调用回调
- Raphaël转换相对于画布的拖动回调坐标
- 如何将具有两个回调的函数调用转换为promise
- 如何通过'这'转换为setTimeout回调
- 如何将回调示例转换为延迟对象
- Node.js:使用Bluebird将模块函数从回调转换为承诺
- 将嵌套回调转换为承诺
- 在.each()回调(D3)中触发平滑转换
- 扩展ES6承诺,将回调转换为Deferred模式
- d3.js:转换回调不会被enter()调用
- 将带有回调的方法转换为返回带有清理的承诺的方法