Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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 AngularJS承诺不回电话?_Javascript_Ajax_Angularjs_Asynchronous_Angular Promise - Fatal编程技术网

Javascript AngularJS承诺不回电话?

Javascript AngularJS承诺不回电话?,javascript,ajax,angularjs,asynchronous,angular-promise,Javascript,Ajax,Angularjs,Asynchronous,Angular Promise,通常,当我以异步方式获取数据时,我会像这样做 var promise = $http.get('/api/v1/movies/avengers'); promise.then( function(payload) { $scope.movieContent = payload; }); $scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request

通常,当我以异步方式获取数据时,我会像这样做

var promise = $http.get('/api/v1/movies/avengers');

promise.then(
  function(payload) {
    $scope.movieContent = payload;
  });
$scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request is done
事实上,这种情况非常常见-我发送一些请求,当它准备好时,我将返回的所有内容都分配给某个变量/道具。但是每次它都需要进行回调,即使回调总是相同的

有什么办法可以像这样做吗

var promise = $http.get('/api/v1/movies/avengers');

promise.then(
  function(payload) {
    $scope.movieContent = payload;
  });
$scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request is done
或者说

updateWhenReady($scope.movieContent , '/api/v1/movies/avengers');

这没什么大不了的,但在我看来,大量使用会产生不同。

您可以将异步调用封装在函数中:

function load(cb, model){
        cb.then(function(payload){
            model = payload;
        });
    }

*但我不建议你这样做。通常,您希望在回调函数中执行特定任务(如处理加载指示器等)。

这并不完全是您所要求的,但您可以“动态”生成这些回调:

或者(如果您更喜欢这种语法):


请注意,错误处理非常重要。如果承诺被拒绝,您可能需要通知用户。

您可以设计您的服务,使其返回空引用,并在服务调用成功返回时填充自身。使用
angular.copy
保留参考:

服务

app.factory('avengersService', function($http) {
   return  {
      getAvengers: function() {
         var avengers = [];
         avengers.$promise = $http.get('/api/v1/movies/avengers').then(function(result) {
             angular.copy(result.data, avengers);
             return result;
         });
         return avengers;
      }
   }
});
控制器

app.controller('ctrl', function($scope, avengersService) {
    $scope.movieContent = avengersService.getAvengers();

    // or call the promise version
    avengersService.getAvengers().$promise.then(function(result) {
         $scope.movieContent = result.data;
    });

});

不。javascript没有这个功能。编写一个服务来实现这一点非常简单NGResource就是这么做的。以前http promise提供了自动承诺展开功能。后来它被弃用了(1.2.x),您只能通过执行
.config(function($parseProvider){$parseProvider.unwrapPromises(true);})来关闭它。在较新版本中,此功能已完全删除。用你正在使用的angular版本试试你的luch。然而,正确的方法是通过承诺本身来实现。另一种方法是在路线中使用resolve。这是创建assingToScope函数的正确方法吗?难道我不应该创建一个有棱角图案的工厂或类似的东西吗?老实说,我不知道。。。我没有那么多关于角度的经验,更多的是关于普通JS;-)