当前位置: 首页 > 面试题库 >

AngularJS $ q.all

锺离霖
2023-03-14
问题内容

我已经在angularjs中实现了$ q.all,但是我无法使代码正常工作。这是我的代码:

UploadService.uploadQuestion = function(questions){

        var promises = [];

        for(var i = 0 ; i < questions.length ; i++){

            var deffered  = $q.defer();
            var question  = questions[i];

            $http({

                url   : 'upload/question',
                method: 'POST',
                data  : question
            }).
            success(function(data){
                deffered.resolve(data);
            }).
            error(function(error){
                deffered.reject();
            });

            promises.push(deffered.promise);
        }

        return $q.all(promises);
    }

这是我的控制器,它调用服务:

uploadService.uploadQuestion(questions).then(function(datas){

   //the datas can not be retrieved although the server has responded    
}, 
function(errors){ 
   //errors can not be retrieved also

})

我认为在我的服务中设置$ q.all存在一些问题。


问题答案:

在javascript中 block-level scopes 不仅有 function-level scopes

阅读有关javaScript作用域和提升的文章。

看看我如何调试您的代码:

var deferred = $q.defer();
deferred.count = i;

console.log(deferred.count); // 0,1,2,3,4,5 --< all deferred objects

// some code

.success(function(data){
   console.log(deferred.count); // 5,5,5,5,5,5 --< only the last deferred object
   deferred.resolve(data);
})
  • 当您var deferred= $q.defer();在for循环内编写代码时,它会被 提升 到函数顶部,这意味着javascript在之外的函数范围内声明了此变量for loop
  • 对于每个循环,最后一个 延迟 的优先级将覆盖前一个循环,没有块级作用域来保存对该对象的引用。
  • 调用异步回调(成功/错误)时,它们仅引用最后一个 延迟的对象, 并且仅对其进行解析,因此 $ q.all永远不会解析, 因为它仍在等待其他延迟的对象。
  • 您需要为要迭代的每个项目创建一个匿名函数。
  • 由于函数确实具有作用域,因此 closure scope 即使在函数执行后,对延迟对象的引用也会保留下来。
  • 正如#dfsq所评论的:由于$ http本身会返回一个promise,因此无需手动构造新的延迟对象。

解决方案angular.forEach

这是一个演示插件:http
://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview

UploadService.uploadQuestion = function(questions){

    var promises = [];

    angular.forEach(questions , function(question) {

        var promise = $http({
            url   : 'upload/question',
            method: 'POST',
            data  : question
        });

        promises.push(promise);

    });

    return $q.all(promises);
}

我最喜欢的方法是使用Array#map

这是一个演示插件:http
://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview

UploadService.uploadQuestion = function(questions){

    var promises = questions.map(function(question) {

        return $http({
            url   : 'upload/question',
            method: 'POST',
            data  : question
        });

    });

    return $q.all(promises);
}


 类似资料:
  • angular是什么? AngularJS 最初由Misko Hevery 和Adam Abrons于2009年开发,后来成为了Google公司的项目。AngularJS弥补了HTML在构建应用方面的不足,其通过使用标识符(directives)结构,来扩展Web应用中的HTML词汇,使开发者可以使用HTML来声明动态内容,从而使得Web开发和测试工作变得更加容易。 安装angular bower

  • 更改历史 * 2018-1-27 高天阳 整理文档 补充$log * 2018-1-23 武超敏 增加$q内容 * 2017-9-17 张飞 添加参考链接 * 2017-6-1 杨丽 初始化文档 1 历史、现状和发展 1.1 历史 AngularJS最初由Misko Hevery和Adam Abrons于2009年开发,后来成为了Goog

  • Angular JS (Angular.JS) 是一组用来开发 Web 页面的框架、模板以及数据绑定和丰富 UI 组件。它支持整个开发进程,提供 Web 应用的架构,无需进行手工 DOM 操作。 AngularJS 很小,只有 60K,兼容主流浏览器,与 jQuery 配合良好。 数据绑定可能是 AngularJS 最酷最实用的特性。它能够帮助你避免书写大量的初始代码从而节约开发时间。一个典型的

  • 本文向大家介绍AngularJS ngCloak,包括了AngularJS ngCloak的使用技巧和注意事项,需要的朋友参考一下 示例 该ngCloak指令用于防止在加载应用程序时浏览器以原始(未编译)形式简短地显示Angular html模板。-查看源 的HTML ngCloak 可以应用于body元素,但是首选用法是将多个ngCloak指令应用于页面的一小部分,以允许逐步呈现浏览器视图。 该

  • 主要内容:Bootstrap,HTML 代码,指令解析,Bootstrap 类解析,JavaScript 代码,myUsers.js,JavaScript 代码解析AngularJS 的首选样式表是 Twitter Bootstrap, Twitter Bootstrap 是目前最受欢迎的前端框架。 查看 Bootstrap教程。 Bootstrap 你可以在你的 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码: <link re

  • 主要内容:AngularJS 全局 API,实例,实例,实例,实例API 意为 Application Programming Interface(应用程序编程接口)。 AngularJS 全局 API AngularJS 全局 API 用于执行常见任务的 JavaScript 函数集合,如: 比较对象 迭代对象 转换对象 全局 API 函数使用 angular 对象进行访问。 以下列出了一些通用的 API 函数: API 描述 angular.lowercas