jQuery AJAX请求需要回调吗?

时间:2018-10-11 02:27:41

标签: javascript jquery google-chrome-extension

我对Javascript / jQuery很陌生,所以请多多包涵。我正在做一个Chrome扩展程序,并且在文件content_script.js中循环浏览链接列表,并发出ajax请求,以确定哪些请求的状态代码为404。我知道请求是异步进行的,因此我怀疑这是为什么当我发送包含从content_script.jspopup.js的数组的消息时,即使{{1 }}在console.log中提出建议。

我很好奇,如果content_script.js中的content_script.js(在消息发送到console.log之前)显示数组已被填充,这怎么可能?我应该使用回调来解决这个问题吗?我已经尝试设置popup.js设置属性ajax,但是我的程序根本没有async:false,并且似乎在等待请求。

content_script.js

console.log

popup.js

// var url = window.location.href;
var validLinks = new Array();
var array = new Array();

grabLinks();

for (var i=0;i<array.length;i++)
{
    $.ajax({
        url: array[i],
        statusCode:{
            404: function(){
                validateLink(array[i]);
            }
        }
    });
}
console.log(validLinks);//this shows me that the array IS populated
chrome.runtime.sendMessage({valid:validLinks}, function(response) {});
//but when I send the message, it is EMPTY in popup.js

function grabLinks(){
    //get all the links from the document
    let links = document.links;
    for (var i=0;i<links.length;i++)
    {
        array.push(links[i].href);
    }
}

function validateLink(link){
    //I check whether the link has been archived, and add it to an array if it has
    console.log("validating link");
    $.getJSON('http://archive.org/wayback/available?url=' + link,function(data){
        if (!$.isEmptyObject(data['archived_snapshots']))
        {
            let code = data['archived_snapshots']['closest']['status'];
            let oldUrl = data['archived_snapshots']['closest']['url'];
            console.log("pushing good url to array");
            validLinks.push(oldUrl);
        }
    });
}

1 个答案:

答案 0 :(得分:0)

是的,它不起作用,因为ajax请求是异步的。

您需要在所有ajax请求(chrome.runtime.sendMessage$.ajax两个请求)完成之后运行$.getJSON函数。计算完成次数,并在完成次数等于array.length时继续操作。

要创建始终在$.ajax完成后运行的回调,请使用$.ajax(...).always(callbackFn)

无法信任登录到控制台的对象和数组,它们在控制台中显示其当前状态-而不是您登录它们时所处的状态。要修复它,请将数组转换为字符串或对其进行克隆。请参阅以下答案以获取更详尽的解释:Weird behavior with objects & console.log