AJAX调用顺序错误(异步)javascript

鲁尼

我正在制作一个使用API​​的函数,以获取有关演出的所有季节的所有信息。现在,我得到了可以获取所有信息的部分,但是所有信息的顺序都不正确。我一直在研究SO,发现AJAX调用是异步的,并且正在做更多的研究。我仍然没有找到我必须在代码中进行确切编辑以使其正常运行的内容。我试图做这样的事情

function makelistbox(seasonnumber,count,slug) {
for (var o = 1; o < count; o++) {
    $.ajax({
        type: "GET",
        url: "https://api-v2launch.trakt.tv/shows/" + slug + "/seasons/" + seasonnumber + "/episodes/" + o,
        headers: {
            "Content-Type": "application/json",
            "trakt-api-version": "2",
            "trakt-api-key": "ACCESSKEY"
        },
        success: function (response) {
            defArr.push(response);
            $.when.apply($,defArr).done(function(){
                AppendContent();
            });
        }
    });
}

}    
function AppendContent(){
console.log(defArr);
for(var u = 0;u<defArr.length;u++){
    select.innerHTML += "<option value='s"+ defArr[u].season +"+ e +"+ defArr[u].number + "'> s" + defArr[u].season + "e" +defArr[u].number+":" + defArr[u].title + "</option>";
}
}

但这似乎不起作用,因为每次我到达$ when.apply ...代码段时,ajax调用似乎都会完成。

这是我的原始代码

function listbox(slug){
$("#popupselect").empty();
$.ajax({
    type: "GET",
    url: "https://api-v2launch.trakt.tv/shows/"+ slug  +"/seasons?extended=full",
    headers: {
        "Content-Type": "application/json",
        "trakt-api-version": "2",
        "trakt-api-key": "ACCESSKEY"
    },
    success : function(response)
    {
        response.forEach(function (object,index) {
            makelistbox(object.number,object.aired_episodes,slug);
        });
    }
});
}
function makelistbox(seasonnumber,count,slug) {
for (var o = 1; o < count; o++) {
     $.ajax({
        type: "GET",
        url: "https://api-v2launch.trakt.tv/shows/" + slug + "/seasons/" + seasonnumber + "/episodes/" + o,
        headers: {
            "Content-Type": "application/json",
            "trakt-api-version": "2",
            "trakt-api-key": "ACCESSKEY"
        },
        success: function (response) {

            AppendContent(response);
        }
    });
}
}
function AppendContent(response){
select.innerHTML += "<option value='s"+ response.season +"+ e +"+ response.number + "'> s" + response.season + "e" +response.number+":" + response.title + "</option>";
}

我的目标是将每个季节的情节及其季节编号,情节编号和情节标题添加到列表框中。我无法按正确的顺序进行此操作。

提前致谢!

编辑-编辑-编辑-编辑-编辑-编辑-编辑-编辑-编辑-编辑

@ Arg0n好的,我也尝试过在我的赛季中使用它,但是效果并不理想。从您的代码和链接中,我认为我必须根据季节的ajax调用创建一个数组,所以我做到了(基本上这意味着我有一个嵌套的promises函数对吗?)。我的代码现在没有给出任何错误,但是也无法按照我想要的方式工作。表示我的剧集仍然要归功于您,但我的季节仍然没有

function listbox(slug){
$("#popupselect").empty();
var arrPromise =[];
arrPromise.push(
$.ajax({
    type: "GET",
    url: "https://api-v2launch.trakt.tv/shows/"+ slug  +"/seasons?extended=full",
    headers: {
        "Content-Type": "application/json",
        "trakt-api-version": "2",
        "trakt-api-key": "ACCESSKEY"
    },
    success: function(response) {
        Promise.all(arrPromise).then(function(content){
            for(var z=0; z< content.length;z++){
                response.forEach(function (object,index) {
                    console.log("chec");
                    makelistbox(object.number,object.aired_episodes,slug);
                });
            }
        })
    }
}));
}
精氨酸0n

基本上,Promises.all()您可以执行以下操作:

var promises = [];
for(var i = 0; i < 5; i++){
    promises.push($.ajax("SomeURL"));
}
Promise.all(promises).then(function(datas){
   for(var y = 0; y < datas.length; y++){
        var data = datas[y]; //Your data in correct order   
   }
});

它等待所有请求promises完成,然后在中调用该函数then结果是一个列表,其中按正确的顺序列出了您的数据。

编辑

转换为您的代码,将是这样的:

function listbox(slug){
    $("#popupselect").empty();
    $.ajax({
        type: "GET",
        url: "https://api-v2launch.trakt.tv/shows/"+ slug  +"/seasons?extended=full",
        headers: {
            "Content-Type": "application/json",
            "trakt-api-version": "2",
            "trakt-api-key": "ACCESSKEY"
        },
        success: function(response) {
            var promises = [];
            response.forEach(function (object,index) {
                var addPromises = makelistbox(object.number,object.aired_episodes,slug);
                for(var i = 0; i < addPromises.length; i++){
                    var promise = addPromises[i];
                    promises.push(promise);
                }
            });
            Promise.all(promises).then(function(responses){
                for(var i = 0; i < responses.length; i++){
                    AppendContent(responses[i]);
                }
            });
        }
    });
}

function makelistbox(seasonnumber,count,slug) {
    var promises = [];
    for (var o = 1; o < count; o++) {
        promises.push($.ajax({
            type: "GET",
            url: "https://api-v2launch.trakt.tv/shows/" + slug + "/seasons/" + seasonnumber + "/episodes/" + o,
            headers: {
                "Content-Type": "application/json",
                "trakt-api-version": "2",
                "trakt-api-key": "ACCESSKEY"
            }
        }));
    }
    return promises;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章