我对Javascript / jQuery很陌生,所以请多多包涵。我正在做一个Chrome扩展程序,并且在文件content_script.js
中循环浏览链接列表,并发出ajax
请求,以确定哪些请求的状态代码为404
。我知道请求是异步进行的,因此我怀疑这是为什么当我发送包含从content_script.js
到popup.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);
}
});
}
答案 0 :(得分:0)
是的,它不起作用,因为ajax请求是异步的。
您需要在所有ajax请求(chrome.runtime.sendMessage
和$.ajax
两个请求)完成之后运行$.getJSON
函数。计算完成次数,并在完成次数等于array.length
时继续操作。
要创建始终在$.ajax
完成后运行的回调,请使用$.ajax(...).always(callbackFn)
无法信任登录到控制台的对象和数组,它们在控制台中显示其当前状态-而不是您登录它们时所处的状态。要修复它,请将数组转换为字符串或对其进行克隆。请参阅以下答案以获取更详尽的解释:Weird behavior with objects & console.log