Javascript API回调

Javascript API回调,javascript,callback,Javascript,Callback,更新:我读到一篇文章说这篇文章被标记为的副本。我通常知道回调应该如何工作。我的问题是,我在创建对象的循环中调用API,因此我不知道如何将回调放入其中,使下一个方法等待,而不在每次循环迭代中调用该回调。 我创建了对象并向其中添加了API数据。我使用回调,以便在API属性可用之前,下一段代码不会运行。回调不起作用 function Media(boxCover, searchName, year) { this.boxCover = boxCover; this.searchName

更新:我读到一篇文章说这篇文章被标记为的副本。我通常知道回调应该如何工作。我的问题是,我在创建对象的循环中调用API,因此我不知道如何将回调放入其中,使下一个方法等待,而不在每次循环迭代中调用该回调。

我创建了对象并向其中添加了API数据。我使用回调,以便在API属性可用之前,下一段代码不会运行。回调不起作用

function Media(boxCover, searchName, year) {
    this.boxCover = boxCover;
    this.searchName = searchName;
    this.year = year;
    this.genre = "";
    this.imdbRating = "";
    apiCall(this);
}

function makeMovieObjects(callback) {

    var table = [
    new Media('imgs/avengers.jpg', "Avengers", "2012"),
    new Media('imgs/blade_runner.jpg', "Blade Runner", "1982")
    ];

  callback(table);
} 

function apiCall(obj){
    var link = "http://www.omdbapi.com/?t=" + obj.searchName + "&y=" + obj.year + "&plot=short&r=json";
    var oReq = new XMLHttpRequest();
    oReq.open("get", link, true);
    oReq.onload = reqListener;
    oReq.send();
    function reqListener() {
        var apiReturn = JSON.parse(this.response);
        obj.genre = apiReturn.Genre;
        obj.imdbRating = apiReturn.imdbRating;
    }
} 

function init(table) {
    for (var i = 0; i < table.length; i++) {
        console.log(table[i]); // object contains all data
        console.log(table[i].genre); // fails (API sourced data) 
        console.log(table[i].year); // success (data hard coded)
    }
}

makeMovieObjects(init(table));
功能媒体(盒盖、搜索名称、年份){
this.boxCover=boxCover;
this.searchName=searchName;
今年=年;
this.genre=“”;
this.imdbRating=“”;
(这一切);
}
函数makeMovieObjects(回调){
变量表=[
新媒体('imgs/avengers.jpg',“avengers”,“2012”),
新媒体(“imgs/blade_runner.jpg”,“blade runner”,“1982”)
];
回调(表);
} 
函数apiCall(obj){
变量链接=”http://www.omdbapi.com/?t=“+obj.searchName+”&y=“+obj.year+”&plot=short&r=json”;
var oReq=新的XMLHttpRequest();
开放(“获取”,链接,真);
oReq.onload=reqListener;
oReq.send();
函数reqListener(){
var apireurn=JSON.parse(this.response);
obj.genre=apireurn.genre;
obj.imdbRating=apireurn.imdbRating;
}
} 
函数init(表){
对于(变量i=0;i
表[i]。只有当执行与其相关的
apiCall
success
回调时,流派才会有数据。您必须创建一个列表来检查是否加载了所有媒体,并在加载所有内容时调用
init
。您试图在收到Ajax响应之前访问属性。我看到您试图在
makeMovieObjects
函数中使用
callback
,但这还不够-您必须在正确的时间调用它,当收到所有响应时。
makeMovieObjects
在创建
媒体
对象后立即调用给定的
回调
函数。此时,
apiCall
启动的异步请求尚未完成。您在控制台中看到这些属性的原因是
console.log(表[i])
记录了对控制台的对象引用(而不是其所有属性的“快照”)。当您在浏览器控制台中检查记录的对象时,它将设置这些额外的属性。