Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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
Javascript 如何将带有回调的简单$http转换为使用承诺_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript 如何将带有回调的简单$http转换为使用承诺

Javascript 如何将带有回调的简单$http转换为使用承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我试着用angular的语言来表达我的承诺,我有下面的例子,我想转换成使用承诺,希望它能帮助我“啊哈!” 我在互联网站上找到的所有例子都是使用服务/工厂/等等,我只想知道最好的方法来实现这种简单的使用承诺 angular.module('web').controller('CardsCtrl',function($scope, $http, $q){ // Don't worry about how the variable "users" gets populated, let's

我试着用angular的语言来表达我的承诺,我有下面的例子,我想转换成使用承诺,希望它能帮助我“啊哈!”

我在互联网站上找到的所有例子都是使用服务/工厂/等等,我只想知道最好的方法来实现这种简单的使用承诺

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;
      });
    }
});
angular.module('web').controller('CardsCtrl',function($scope,$http,$q){
//不用担心变量“users”是如何填充的,我们只需说它是从独角兽的号角中神奇地出现的。
$scope.users=用户;
//循环遍历所有用户
对于(变量i=0;i<$scope.users.length;i++){
//这会失败,因为循环在第一个GET请求完成之前完成,所以我们无法引用I变量
$http.get('http://uifaces.com/api/v1/random,函数(面){
$scope.users[i].face=face.image\u url.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));
}
for(变量i=0;i<$scope.users.length;i++){
(职能(一){
$http.get('http://uifaces.com/api/v1/random,函数(面){
$scope.users[i].face=face.image\u url.mini;
});
}(i) );
}

你所拥有的不是承诺的问题。这只是经典的“循环中的闭包”问题

像这样修复它:

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));
}
for(变量i=0;i<$scope.users.length;i++){
(职能(一){
$http.get('http://uifaces.com/api/v1/random,函数(面){
$scope.users[i].face=face.image\u url.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
 });

以下是我的写作方式:

 $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
 });

您正在使用resfull api吗?如果是这样的话,$resource服务就是为此而设计的不,我只是使用一个端点。我不确定,因为我通常使用$resource服务,但你应该试试。我通常做的是
$resource('myurl')。$promise()
将您的请求转换为promisse,然后您可以使用
。然后()
如果您需要它,这是有用的。您使用的是resfull api吗?如果是这样的话,$resource服务就是为此而设计的不,我只是使用一个端点。我不确定,因为我通常使用$resource服务,但你应该试试。我通常做的是,
$resource('myurl')。$promise()
将您的请求转换为promisse,然后您可以使用
。然后()
如果您需要它,这很有用。我想学习promises,所以我很好奇您如何将其转换为使用promisse。但是我也有兴趣让你在你拥有的循环中详细说明这个函数。@Catfish w.r.t闭包问题,就这样:@Catfish对于承诺问题,你应该首先有一个更简单的例子:有一些回调地狱来转换为承诺。很简单。对承诺来说,序列并不难,但它们肯定比你应该首先经历的简单事情更难。我想学习承诺,所以我很好奇你会如何将其转化为使用承诺。但是我也有兴趣让你在你拥有的循环中详细说明这个函数。@Catfish w.r.t闭包问题,就这样:@Catfish对于承诺问题,你应该首先有一个更简单的例子:有一些回调地狱来转换为承诺。很简单。承诺的顺序并不难,但它们肯定比你应该首先经历的简单事情更难。我相信
map
不是顺序的,是吗?这方面的
$q
等价物是什么?使用.all和数组mapI相信
map
不是顺序的,是吗?
$q
与此等效的是什么?使用.all和数组映射