来自一系列 getJSON() 调用的合并结果对象
Consolidated result object from a sequence of getJSON() calls
我用了很长时间 jquery
。
我有一个要求,我需要调用一些 Rest API 来从每个 API 中获取一些数据。然后从所有调用的结果中创建一个合并的结果对象。
像这样:
我正在寻找的输出:
result {
a: 123,
b: 456, ....
z: 789
}
伪:
var result = {}; // final object containing consolidated result
$.getJSON(restapi1, function (data) {
result["a"] = data.total;
});
// next rest call to fetch b
$.getJSON(restapi2, function (data) {
result["b"] = data.total;
});
// so on...
// after fetching all values and storing them in one result object access elements like
var value1 = result.a;
我知道我可以使用 Promise.all()
,但它给出了一个数组作为输出,我想避免循环遍历它来获取所需的元素。
求推荐。
谢谢。
I know I can use Promise.all()
, but it gives an array as output
是的,但您不必使用它提供的结果。您可以像在伪代码中那样使用副作用。
如果您的各种 $.getJSON
调用都是单独编写的,这是 jQuery 的 $.when
:
的用例
var result = {}; // final object containing consolidated result
$.when(
$.getJSON(restapi1, function (data) {
result["a"] = data.total;
}),
// next rest call to fetch b
$.getJSON(restapi2, function (data) {
result["b"] = data.total;
}),
// ...
).done(function() {
// use `result`
});
如果你有一个循环,使用 $.when
是可能的,但很尴尬:
var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
promise.push($.getJSON(/*...*/));
}
$.when.apply($, promises).done(function() {
// use `result`
});
...所以在那种情况下 Promise.all
可能更好,前提是你可以假设它存在于环境中(本地,或者因为你填充它或使用增强的承诺库):
var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
promise.push($.getJSON(/*...*/));
}
Promise.all(promises).done(function() {
// use `result`
});
我会像下面这样处理:
// a wrapper for the basic retrieval functionality
async function getTotal( param ) {
const res = await $.getJSON( param.url );
return { name: param.name, total: res.total };
}
async function getData() {
// start all requests
// api list contains entries like { name: 'a', url: restapi1 }
const reqs = apilist.map( url => getTotal )
// wait for all requests to finish
const resp = await Promise.all( reqs );
// convert to the output format
return resp.reduce( (el,all) => { all[el.name] = el.total; return all; }, {} );
}
getData().then( (result) => /* ... */ );
我用了很长时间 jquery
。
我有一个要求,我需要调用一些 Rest API 来从每个 API 中获取一些数据。然后从所有调用的结果中创建一个合并的结果对象。
像这样:
我正在寻找的输出:
result {
a: 123,
b: 456, ....
z: 789
}
伪:
var result = {}; // final object containing consolidated result
$.getJSON(restapi1, function (data) {
result["a"] = data.total;
});
// next rest call to fetch b
$.getJSON(restapi2, function (data) {
result["b"] = data.total;
});
// so on...
// after fetching all values and storing them in one result object access elements like
var value1 = result.a;
我知道我可以使用 Promise.all()
,但它给出了一个数组作为输出,我想避免循环遍历它来获取所需的元素。
求推荐。 谢谢。
I know I can use
Promise.all()
, but it gives an array as output
是的,但您不必使用它提供的结果。您可以像在伪代码中那样使用副作用。
如果您的各种 $.getJSON
调用都是单独编写的,这是 jQuery 的 $.when
:
var result = {}; // final object containing consolidated result
$.when(
$.getJSON(restapi1, function (data) {
result["a"] = data.total;
}),
// next rest call to fetch b
$.getJSON(restapi2, function (data) {
result["b"] = data.total;
}),
// ...
).done(function() {
// use `result`
});
如果你有一个循环,使用 $.when
是可能的,但很尴尬:
var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
promise.push($.getJSON(/*...*/));
}
$.when.apply($, promises).done(function() {
// use `result`
});
...所以在那种情况下 Promise.all
可能更好,前提是你可以假设它存在于环境中(本地,或者因为你填充它或使用增强的承诺库):
var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
promise.push($.getJSON(/*...*/));
}
Promise.all(promises).done(function() {
// use `result`
});
我会像下面这样处理:
// a wrapper for the basic retrieval functionality
async function getTotal( param ) {
const res = await $.getJSON( param.url );
return { name: param.name, total: res.total };
}
async function getData() {
// start all requests
// api list contains entries like { name: 'a', url: restapi1 }
const reqs = apilist.map( url => getTotal )
// wait for all requests to finish
const resp = await Promise.all( reqs );
// convert to the output format
return resp.reduce( (el,all) => { all[el.name] = el.total; return all; }, {} );
}
getData().then( (result) => /* ... */ );