通过服务有角度地加载本地json文件

2024-01-08

我正在尝试在与我的服务文件相同的目录中加载本地 json 文件。

没有 JS 错误,在 Net 选项卡下,我可以看到 json 文件已加载。

然而,将响应 txt 设置为 var“static_obj”不会加载 JSON 数据。当我将 JSON 数据硬编码为 var WEBTEST = {} 时,它加载得很好。为什么?

'use strict';

webTestApp.factory('webtest', function ($q, $timeout) {
var Webtest = {
    //Methods exposed for the class
    fetch: function(callback){
        //fetch the data from below hard coded
        var deferred = $q.defer();        
        var static_obj = [];
        var promised = deferred.promise;
        var xobj = new XMLHttpRequest();

        //giving an artificial delay of .03 seconds..
        //controller will render the page & will show the service data after .03 seconds
        $timeout(function(){
            xobj.overrideMimeType("application/json");
            xobj.open('GET', 'angular/scripts/services/webtest.json', true);
            xobj.onreadystatechange = function () {
                if (xobj.readyState == 4 && xobj.status == "200") {
                    static_obj = $.parseJSON(xobj.responseText);
                }
            };
            xobj.send(null);
            promised.then(callback(static_obj))
        }, 30);

        return promised;
    }
}

return Webtest;
});

下面的代码工作得很好,但我希望能够加载 json 文件而不是硬编码 JSON。

'use strict';

webTestApp.factory('webtest', function ($q, $timeout) {
var Webtest = {
    //Methods exposed for the class
    fetch: function(callback){
        //fetch the data from below hard coded
        var deferred = $q.defer();        
        var static_obj = null;
        var promised = deferred.promise;

        //giving an artificial delay of .03 seconds..
        //controller will render the page & will show the service data after .03 seconds
        $timeout(function(){
            static_obj = WEBTEST;
            promised.then(callback(static_obj))
        }, 30);

        return promised;
    }
}

return Webtest;
});

var WEBTEST = [
{"id": "0","Name": "Items 0", "Description": "Description 0"},
{"id": "1","Name": "Items 1", "Description": "Description 1"},
{"id": "2","Name": "Items 2", "Description": "Description 2"},
{"id": "3","Name": "Items 3", "Description": "Description 3"},
{"id": "4","Name": "Items 4", "Description": "Description 4"},
{"id": "5","Name": "Items 5", "Description": "Description 5"},
{"id": "6","Name": "Items 6", "Description": "Description 6"},
{"id": "7","Name": "Items 7", "Description": "Description 7"},
{"id": "8","Name": "Items 8", "Description": "Description 8"},
{"id": "9","Name": "Items 9", "Description": "Description 9"},
{"id": "10","Name": "Items 10", "Description": "Description 10"},
{"id": "11","Name": "Items 11", "Description": "Description 11"},
{"id": "12","Name": "Items 12", "Description": "Description 12"},
{"id": "13","Name": "Items 13", "Description": "Description 13"},
{"id": "14","Name": "Items 14", "Description": "Description 14"},
{"id": "15","Name": "Items 15", "Description": "Description 15"},
{"id": "16","Name": "Items 16", "Description": "Description 16"},
{"id": "17","Name": "Items 17", "Description": "Description 17"},
{"id": "18","Name": "Items 18", "Description": "Description 18"},
{"id": "19","Name": "Items 19", "Description": "Description 19"},
{"id": "20","Name": "Items 20", "Description": "Description 20"},
{"id": "21","Name": "Items 21", "Description": "Description 21"},
{"id": "22","Name": "Items 22", "Description": "Description 22"},
{"id": "23","Name": "Items 23", "Description": "Description 23"},
{"id": "24","Name": "Items 24", "Description": "Description 24"},
{"id": "25","Name": "Items 25", "Description": "Description 25"},
{"id": "26","Name": "Items 26", "Description": "Description 26"},
{"id": "27","Name": "Items 27", "Description": "Description 27"},
{"id": "28","Name": "Items 28", "Description": "Description 28"},
{"id": "29","Name": "Items 29", "Description": "Description 29"},
{"id": "30","Name": "Items 30", "Description": "Description 30"},
{"id": "31","Name": "Items 31", "Description": "Description 31"},
{"id": "32","Name": "Items 32", "Description": "Description 32"},
{"id": "33","Name": "Items 33", "Description": "Description 33"},
{"id": "34","Name": "Items 34", "Description": "Description 34"},
{"id": "35","Name": "Items 35", "Description": "Description 35"},
{"id": "36","Name": "Items 36", "Description": "Description 36"},
{"id": "37","Name": "Items 37", "Description": "Description 37"},
{"id": "38","Name": "Items 38", "Description": "Description 38"},
{"id": "39","Name": "Items 39", "Description": "Description 39"},
{"id": "40","Name": "Items 40", "Description": "Description 40"},
{"id": "41","Name": "Items 41", "Description": "Description 41"},
{"id": "42","Name": "Items 42", "Description": "Description 42"},
{"id": "43","Name": "Items 43", "Description": "Description 43"},
{"id": "44","Name": "Items 44", "Description": "Description 44"},
{"id": "45","Name": "Items 45", "Description": "Description 45"}
];

你有没有理由不使用内置功能$http获取 JSON 的服务?用它可以更简单:

webTestApp.factory('webtest', function($timeout, $http) {
    var Webtest = {
        fetch: function() {
            return $timeout(function() {
                return $http.get('webtest.json').then(function(response) {
                    return response.data;
                });
            }, 30);
        }
    }

    return Webtest;
});

并在控制器中:

webtest.fetch().then(function(data) {
    $scope.data = data;
});

这是固定代码:

http://plnkr.co/edit/f1HoHBGgv9dNO7D7UfPJ?p=preview http://plnkr.co/edit/f1HoHBGgv9dNO7D7UfPJ?p=preview

不管怎样,你的问题是你返回了承诺但从未解决(deferred.resolve) 它。在这一行

promised.then(callback(static_obj))

您不解决承诺,而是手动调用callback一些数据。它之所以有效,是因为在硬编码的 json 对象的情况下,它已经在页面中可用,但在 ajax 请求的情况下,您尝试在响应到来之前调用它。所以你需要移动promised.then(callback(static_obj)) into onreadystatechange功能。但如果你采用这种方式,你根本不需要 deferred 和 Promise,你只需使用回调。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过服务有角度地加载本地json文件 的相关文章

随机推荐

  • knockoutjs 提交时出现 ko.utils.postJson 问题

    我跟着http blog stevensanderson com 2010 07 12 editing a variable length list knockout style http blog stevensanderson com
  • Meteor:对电子邮件验证确认执行某些操作

    在我的服务器上 我设置帐户需要电子邮件验证并发送验证电子邮件 Accounts config sendVerificationEmail true forbidClientAccountCreation false 我在网上的某个地方读到
  • python:不可变的私有类变量?

    有没有办法把这个Java代码翻译成Python class Foo final static private List
  • 使用 Spring 设计 Java 库

    我正在将现有程序中的一些功能提取到一个单独的库中 该程序使用 Spring 进行依赖注入和其他任务 我也想继续在库中使用它 该库需要监视文件系统的更改 因此它将启动某种单独的线程来执行此操作 我真的不知道我的库初始化选项是什么 如何初始化库
  • 如何使用 selenium webdriver 自动化基于 Flash 的页面

    我是一名测试员 我们使用一种工具 其中包含使用 Flash 开发的页面 我需要自动化一些出于测试目的而重复的任务 我了解 Selenium Web 驱动程序 但我无法检查这些闪存页面上的任何元素 请帮助我解决这个问题 我玩过闪存硒 http
  • 如何使用 Socket 获取 Asterisk 服务器的状态 - Python

    我试图使用 python 套接字获取 Asterisk 服务器的状态 但没有任何反应 这是我的代码 import socket s socket socket socket AF INET socket SOCK STREAM HOST 1
  • 输出文件时使用Powershell环境变量作为字符串

    我在用获取 WindowsAutopilotInfo https www powershellgallery com packages Get WindowsAutoPilotInfo 3 5生成计算机的序列号和哈希代码并将该信息导出为 C
  • 在 CI/CD 中如何管理前端和后端之间的依赖关系?

    我将描述我的设置 以使问题不那么抽象 但它们似乎并不针对我的情况 Context 我们有 Python Django 后端和 VueJS 前端 每个都位于存储库中 并使用 Portainer 使用堆栈 配置和部署 Gitlab CI 每个存
  • F#:let mutable 与 ref

    首先 我承认这个问题可能是重复的 请告诉我 我很好奇当需要可变性时 一般的 最佳实践 是什么 F 似乎为此提供了两种工具 let mutable绑定 它的工作方式似乎类似于 大多数 语言中的变量 以及引用单元格 使用ref函数 需要显式解除
  • 在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o?

    我正在尝试通过查看一些练习来提高我的伊德里斯技能软件基础 https softwarefoundations cis upenn edu lf current toc html 最初是为 Coq 设计的 但我希望对 Idris 的翻译不会太
  • 为什么 QToolTips 不会出现在 QMenu 内的 QActions 上

    我正在用 GUI 编写一个应用程序PySide 我设置了一个QMenu on a QPushButton 添加了几个QActions via QMenu addAction 为了进一步向我添加的用户解释这些操作QToolTip与这些QAct
  • 64 位应用程序启动 32 位进程

    我正在开发一个使用 Net 4 0 C 编码的 64 位应用程序 在此应用程序中 在某些时候 我需要启动另一个exe使用以下代码创建文件 l process StartInfo FileName sFullFilePath l proces
  • iOS WKWebView 服务工作者

    从 iOS 15 开始 appCache 被禁用 所以我正在寻找替代方案 是否有启用 WKWebView Service Workers 的官方方法 我知道你可以添加 info plist 键WKAppBoundDomains然后通过实例化
  • 离子选项卡和侧面菜单历史记录

    我想在侧面菜单应用程序内放置一个选项卡式视图 但只是在应用程序的某些视图中 在应用程序中有以下状态结构 Login login menuContent Orders list app orders menuContent Descripti
  • 更改 Qt QML 中按钮的字体大小

    如何在 QML 中设置 Button 控件中文本的字体大小 设计者没有选择 并且 font 不是 Button 的有效属性 Button id cmdQuit text qsTr Quit width 64 height 32 您设置按钮的
  • Firebase v9 上传图片仅显示 9 个字节

    我使用 React Native 和 Firebase v9 将图像上传到 Firebase 在 firebase 存储中 文件已上传 但大小只有 9 个字节 因此无法正常打开 我不知道如何解决这个问题 S const uploadFile
  • DELPHI - 如何更改 VCL 表单应用程序中的 TButton 背景颜色?

    在我的 Delphi VCL 表单应用程序中 我必须更改 TButton 的背景颜色 有没有办法在不使用第三方组件的情况下应用此更改 Thanks 你不能改变 a 的颜色TButton http docwiki embarcadero co
  • 插件 org.jetbrains.android 无法保存设置并已被禁用

    启动 Android Studio 1 2 时 我收到错误消息 插件 org jetbrains android 无法保存设置并已 残疾人 我尝试重新启动 甚至下载了最新的 Android 插件 但没有帮助 有什么建议么 我遇到了同样的问题
  • C# 获取给定路径的文件夹深度的最佳方法?

    我正在做一些需要遍历文件系统的事情 对于任何给定的路径 我需要知道我在文件夹结构中的 深度 这是我目前正在使用的 int folderDepth 0 string tmpPath startPath while Directory GetP
  • 通过服务有角度地加载本地json文件

    我正在尝试在与我的服务文件相同的目录中加载本地 json 文件 没有 JS 错误 在 Net 选项卡下 我可以看到 json 文件已加载 然而 将响应 txt 设置为 var static obj 不会加载 JSON 数据 当我将 JSON