我有一个包含IMDb ID的> 15k电影的json对象
0: ObjectID: "1."
IdIMDb: "tt2322441"
Title: "Fifty Shades of Grey"
Year: 2015
1: ObjectID: "2."
IdIMDb: "tt1617661"
(...)
我希望用其他api的数据来完成这些数据
我的问题是:使用此API中的数据完成数据的最有效方式是什么? 我计划只运行一次这个程序并存储结果,以便它可以尊重api限制。
我的第一个想法是做这样的事情
data.forEach(function (d, i) {
d.Poster = OMDbApi(d.IdIMDb);
...
}
function OMDbApi(i) {
$.ajax({
url:"http://www.omdbapi.com/?i="+i+"&plot=short&r=json",
crossDomain: true,
dataType: "jsonp",
success: function (response) {
return response.Poster;
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
error = 1;
}
});
}
感谢您提供的任何帮助: - )
答案 0 :(得分:2)
var totalCalls = 15000;
var calls = 0;
data.forEach(function (d, i) {
OMDbApi(I, d.IdIMDb); //posterCall
}
function OMDbApi(index, id) {
$.ajax({
url:"http://www.omdbapi.com/?i="+id+"&plot=short&r=json",
crossDomain: true,
dataType: "jsonp",
dataObj : index,
success: function (response) {
window.data[this.dataObj].Poster = response.poster;
calls++;
if (calls == totalCalls)
{
alert("We're done");
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
error = 1;
}
});
}
这项工作具有Ajax的异步性质。
您可能希望跟踪所有请求,并在完成所有请求后显示消息。我添加了一个如何跟踪的简单示例。重要的是你知道要打多少次电话。因此,您需要计算ID的数量,并将该数量乘以完成日期所需的调用。例如:每个对象必须进行三次调用才能完成数据; 海报,导演和运行时。有14500个对象。这将导致总共
3*14500 = 43500
次呼叫。调用完成后,脚本会向变量调用添加1。当呼叫等于totalCalls时,会显示一个警报。