Javascript 在一个函数中使用来自两个单独JSON文件的数据
我在main.js文件的函数中尝试访问两个本地JSON文件。只要一个JSON文件,一切都正常,但我不确定如何合并第二个JSON文件。理想情况下,像Javascript 在一个函数中使用来自两个单独JSON文件的数据,javascript,json,Javascript,Json,我在main.js文件的函数中尝试访问两个本地JSON文件。只要一个JSON文件,一切都正常,但我不确定如何合并第二个JSON文件。理想情况下,像data\u set1=$.getJSON(“file1.json”)这样的东西可以很好地工作,但我看到类似的问题已经被反复问过,而且由于异步调用,这不一定是可能的(我不完全理解这些问题的所有答案) 这就是它的工作原理: $.getJSON("data.json", function(json){ var data_points = [];
data\u set1=$.getJSON(“file1.json”)
这样的东西可以很好地工作,但我看到类似的问题已经被反复问过,而且由于异步调用,这不一定是可能的(我不完全理解这些问题的所有答案)
这就是它的工作原理:
$.getJSON("data.json", function(json){
var data_points = [];
for (i = 0; i < json.length; i++){
data_points.push([json[i].name, json[i].age]);
}
$(function () {
//do stuff with data_points
$.getJSON(“data.json”),函数(json){
var数据_点=[];
for(i=0;i
但是我不知道如何合并第二个JSON调用,为最后使用的函数创建另一个列表。ajax请求是对一个资源的一个请求。不能用同一个请求获取两个不同的资源。您可能需要两个请求:
var completed = 0;
$.getJSON('file1.json', function(json) {
completed++;
if (completed == 2) { all_done(); }
}
$.getJSON('file2.json', function(json) {
completed++;
if (completed == 2) { all_done(); }
}
function all_done(...) { ... }
或者在服务器上将两个json文件合并为一个:
{"file1":{data from file one here}, "file2":{data from file two here}}
并在代码中以
数据.file1
和数据.file2
的形式访问它们。ajax请求是对一个资源的一个请求。不能用同一个请求获取两个不同的资源。您可能需要两个请求:
var completed = 0;
$.getJSON('file1.json', function(json) {
completed++;
if (completed == 2) { all_done(); }
}
$.getJSON('file2.json', function(json) {
completed++;
if (completed == 2) { all_done(); }
}
function all_done(...) { ... }
或者在服务器上将两个json文件合并为一个:
{"file1":{data from file one here}, "file2":{data from file two here}}
并在代码中以
data.file1
和data.file2
的形式访问它们。您可以设置一个var来指示文件已加载,并在检查状态时调用相同的函数。根据JSON中的数据量,这可能不是一个好主意
var xFileLoaded = false, yFileLoaded = false;
var xFile, yFile;
$.getJSON("data.json", function(json){
xFile = json;
xFileLoaded = true;
doSomething();
});
$.getJSON("data.json", function(json){
yFile = json;
yFileLoaded = true;
doSomething();
});
function doSomething() {
if(xFileLoaded && yFileLoaded) {
// good to go
}
}
您可以只设置一个var来指示文件已加载,并在检查状态时调用相同的函数。根据JSON中的数据量,这可能不是一个好主意
var xFileLoaded = false, yFileLoaded = false;
var xFile, yFile;
$.getJSON("data.json", function(json){
xFile = json;
xFileLoaded = true;
doSomething();
});
$.getJSON("data.json", function(json){
yFile = json;
yFileLoaded = true;
doSomething();
});
function doSomething() {
if(xFileLoaded && yFileLoaded) {
// good to go
}
}
您可以使用jQuery延迟加载
var xFile, yFile;
var requestX = $.getJSON("data1.json", function(json){
xFile = json;
});
var requestY = $.getJSON("data2.json", function(json){
yFile = json;
});
$.when(requestX, requestY).then(function(){
// do something;
// this function only gets called when both requestX & requestY complete.
});
签出您可以使用jQuery延迟加载
var xFile, yFile;
var requestX = $.getJSON("data1.json", function(json){
xFile = json;
});
var requestY = $.getJSON("data2.json", function(json){
yFile = json;
});
$.when(requestX, requestY).then(function(){
// do something;
// this function only gets called when both requestX & requestY complete.
});
请使用与@MarcB的解决方案非常相似的方法查看,我会将文件保存在一个数组中,并稍微概括一下:
var files = ["file1.json", "file2.json"];
var results = {};
var completed = 0;
function afterEach(fileName, json) {
results[fileName] = json;
if (++completed >= files.length) {
afterAll();
}
}
files.forEach(function (file) {
$.getJSON(file, afterEach.bind(this, file));
});
这将并行请求所有文件,允许浏览器选择实际打开和下载的连接数。每次完成后,结果(
json
)将放在文件名下的散列中存储。所有文件完成后(假设文件
不变),然后调用函数。使用非常类似于@MarcB的解决方案,我会将文件保存在一个数组中,并稍微概括一下:
var files = ["file1.json", "file2.json"];
var results = {};
var completed = 0;
function afterEach(fileName, json) {
results[fileName] = json;
if (++completed >= files.length) {
afterAll();
}
}
files.forEach(function (file) {
$.getJSON(file, afterEach.bind(this, file));
});
这将并行请求所有文件,允许浏览器选择实际打开和下载的连接数。每次完成后,结果(json
)将放在文件名下的散列中存储。所有文件完成后(假设文件
不变),然后调用函数。jquery提供了一种优雅的方法:
$.when(
$.ajax({
url: 'file1.json/',
success: function(data) {
// Treatement
}
}),
$.ajax({
url: 'file2.json',
success: function(data) {
// Treatement
}
})
).then( function(){
// Two calls are completed
});
完成这两个调用后,您可以在块“then”中执行任何操作。jquery提供了一种优雅的方法:
$.when(
$.ajax({
url: 'file1.json/',
success: function(data) {
// Treatement
}
}),
$.ajax({
url: 'file2.json',
success: function(data) {
// Treatement
}
})
).then( function(){
// Two calls are completed
});
一旦这两个调用完成,您就可以在“then”块中执行任何操作.@mplungjan:仍然有两个调用。这实际上是并行调用,而不是强制执行顺序调用。它们确实不是大文件,这是一次性任务。我曾考虑过嵌套它们,但这看起来真的很难看。我喜欢这个解决方案;我现在正在测试它。@mplungjan:仍然有两个调用。这实际上是d并行执行调用,而不是强制执行顺序调用。它们确实不是大文件,这是一次性任务。我曾考虑过嵌套它们,但这看起来非常难看。我喜欢这个解决方案;我现在正在测试它。要获取第二个文件,是否需要第一个文件中的数据,或者可以同时请求和JUDon’不要等到两个都到达了?我正在同一组轴上绘制数据,所以我同时需要它们,但我可以先得到一个,也可以同时得到一个。在我得到它们之前,我无法生成图形。您是否需要第一个文件中的数据来获取第二个文件,或者您可以同时要求两个文件,然后等待它们都得到到达?我正在将数据绘制在同一组轴上,因此我同时需要它们,但我可以先获取一个轴,也可以同时获取一个轴。只有在拥有它们之前才能构建图形。我想我更喜欢$。当($.ajax(“/page1.php”),$.ajax(/page2.php”)。然后(myFunc,myFailure)
@mplungjan在这种情况下,您将在何处保留您的响应?@mplungjan刚刚阅读了它的文档,我们在成功回调中得到了两个响应。这样会更干净。特别是因为我相信您的构造不会延迟响应calls@mplungjan同意。在我的例子中,Ajax调用在移交给不同的API之前就开始了。我想我fer$.when($.ajax(“/page1.php”),$.ajax(“/page2.php”)。然后(myFunc,myFailure)
@mplungjan在这种情况下,您将在何处保留您的响应?@mplungjan刚刚阅读了它的文档,我们在成功回调中得到了两个响应。这样会更干净。特别是因为我相信您的构造不会延迟响应calls@mplungjan同意。在我的例子中,Ajax调用在将其移交给不同的API之前开始。