【问题标题】:fetch movie data from API's in javascript从 javascript 中的 API 获取电影数据
【发布时间】:2015-02-21 14:35:11
【问题描述】:

我有一个 >15k 电影的 json 对象,其中包含这样的 IMDb ID

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;
        } 
    });
}

感谢您提供的任何帮助:-)

【问题讨论】:

  • 由于 AJAX 的异步工作方式,您当前的设置将无法正常工作。
  • @Mouser 链接显示已启用 CORS,因此不需要 jsonp
  • @charlietfl 然后别介意第二部分。

标签: javascript ajax json api imdb


【解决方案1】:
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 的数量并将该数量乘以完成日期所需的调用。例如:每个对象都要进行3次调用才能完成数据; 海报、导演和运行时。有 14500 个对象。这将导致总共有3*14500 = 43500 调用。当调用完成时,该脚本将变量调用加 1。当呼叫数等于总呼叫数时,将显示警报。

【讨论】:

  • 我收到错误:“iObject.Poster = respone.poster;”行中的“Uncaught ReferenceError: respone is not defined”
  • 哎哟我没发现 :-)
  • 它似乎工作,但我无法在 ajax 请求后打印数据。仅当所有 ajax 请求都完成后如何执行代码?
  • @user456789123 我已经更新了黄色框内的代码和说明。
  • @user456789123 您可以简单地删除警报并将其替换为console.log(window.data),这应该可以读出数据。 (如果该位置的数据不起作用,请尝试window.data)。
猜你喜欢
  • 2017-11-12
  • 2015-02-10
  • 2021-07-29
  • 2013-04-12
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多