javascript - 成功、然后以及 AngularJS 中的解析、 promise 、http 之间的区别

标签 javascript jquery angularjs

在jquery中,当我们触发ajax调用时,当它成功时,会调用success函数,但是,现在在 Angular 中,我看到人们使用then以及success。谷歌搜索了一下我发现 then 返回一个 promise 。 如果我想加载一个包含来自服务的数据的路由,我在将数据绑定(bind)到模板之前使用resolve执行http req,但在http中我没有使用success/then

我的http请求部分:

movieserviceObj.getlist=function(){ 
  return 
      $http({ url:'app/api/entertainment.php',data:$.param(dataString),method:'POST'});

解决配置中的部分:

 resolve:{movieslist:moviesController.getallMovies}

Controller :

var moviesController=app.controller('moviesController',function($scope,movieslist){
$scope.movies=movieslist.data.result 
});

moviesController.getallMovies=function($q,$timeout,movieservice)
{
var defer=$q.defer();

$timeout(function(){
    defer.resolve(movieservice.getlist());
},1000);

return defer.promise;
}

现在上面的代码工作完全正常,但数据绑定(bind)发生在 $timeout 中设置的 1 秒后。我的问题是 http 请求在 1 秒内获取数据,但我也必须等待 1 秒。有什么办法,一旦 http 请求完成,它应该返回 promise 解决,直到显示加载栏?在 http 中,我没有使用 success/then 那么它是如何工作的。此外,即使在成功的 http 请求之后,我如何确保它具有名为“status”的 key 作为响应设置为 true,如果 true 则仅解决或拒绝。

最佳答案

$http 已经返回了一个 Promise,因此使用 then() 在这里更有意义,因为:

  • 您无需每次等待1秒
  • 如果请求时间超过 1 秒,您不会面临无法获取数据的风险

这是一个例子:

var moviesController = app.controller('moviesController',function($scope, movieservice){
    movieservice.getlist().then(function(res){
        $scope.movies = res.data;
    }, function(err){
        console.log('error:', err);
    });
})

});

关于thensuccess之间的实际差异有一些很好的观点:Angular HttpPromise: difference between `success`/`error` methods and `then`'s arguments .

<小时/>

Also even after successful http request how can I make sure that it has key named 'status' in response set to true, if true then only resolve or reject.

您必须修改您的服务才能执行此操作,类似于您在 Controller 中所做的操作:

movieserviceObj.getlist=function(){ 
    var defer=$q.defer();
    $http({
        url:'app/api/entertainment.php',
        data:$.param(dataString),
        method:'POST'
    }).then(function(res){
        if (res.status === true) {
            defer.resolve(res);
        }
        else {
            defer.reject({error: 'Status not true'});
        }
    }, function(err) {
        defer.reject(err);
    })

    return defer.promise;
}
<小时/>

有关路由解析的信息:

An optional map of dependencies which should be injected into the controller. If any of these dependencies are promises, the router will wait for them all to be resolved or one to be rejected before the controller is instantiated. If all the promises are resolved successfully, the values of the resolved promises are injected and $routeChangeSuccess event is fired. If any of the promises are rejected the $routeChangeError event is fired.

关于javascript - 成功、然后以及 AngularJS 中的解析、 promise 、http 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237155/

相关文章:

javascript - 为两个 ID 设置一个变量的正确语法

javascript - AngularJS 中的 $scope 不起作用

angularjs - if $scope.val =3 则使用 ng-repeat 运行循环 3 次

javascript - Angular 加载 css 文件需要时间并在控制台中抛出错误

javascript - lodash 按数组的属性数组过滤

javascript - html 多级展开折叠对于多行表很慢

javascript - HighMaps 仅显示美国 map 中最后一个系列的颜色

javascript - 单击第二个后取消选中第一个过滤器

javascript - 如何使我的代码仅警报 'gggg' ,无法使用 jquery 删除第一个语句

php - 根据第一个动态下拉列表中的选择填充第二个动态下拉列表的 Ajax 方法