jQuery中的每个循环中的多个AJAX调用在异步为真时导致错误
Multiple AJAX calls in jQuery each loop causing error when async is true
我正在创建一个Chrome扩展程序,该扩展程序将在网站上的some_link
旁边添加一个链接图像。我正在使用 AJAX 以便从页面中获取链接,该链接some_link
链接到如下所示:
$( function() {
$( '#list_of_links li' ).each( function() {
var refLink = $( this ).find( '.link_id' );
var some_link = refLink.attr( 'href' );
var imagesrc = chrome.extension.getURL('image.png');
var href;
$.ajax({
url: some_link,
success:function( data ) {
href = $( data ).find( '#link_i_want' ).attr( 'href' );
var linked_image = '<a href="' + href + '"><img src="' + imagesrc + '"></a>';
$( linked_image ).insertAfter( refLink );
},
async: false
});
});
});
这将插入列表中所有链接的图像以及正确链接,但当然会挂起浏览器,直到所有 AJAX 调用完成。我知道设置async: true
(或简单地删除async
设置(将防止这种挂起,但它会产生另一个问题:只插入一些图像,jQuery抛出以下错误:
Uncaught Error: Syntax error, unrecognized expression: Your request is already in process. Please click your browser's Refresh/Reload button to continue.
在我的搜索中,我没有找到任何提及此错误的内容,我想知道是什么原因造成的,以及如何使我的代码与async: true
一起使用以加快页面加载速度并防止 Chrome 挂起。
任何帮助将不胜感激。谢谢!
更新:
在查看了jqXHR对象的内容后,我发现其中一些是text/plain
的,而不是text/html
的,它们应该是。然后我看了看文本是什么,发现它是:
您的请求已在处理中。请单击浏览器的"刷新/重新加载"按钮继续。
似乎正在发生的事情是服务器或 Chrome 返回纯文本而不是 HTML,因为我太快地发出了太多请求。现在我试图发现的是是否有办法防止这种情况发生。
未测试,但我会尝试
function ajaxLoop(i) {
var refLink = jQuery('.link_id').eq(i);
var some_link = refLink.attr('href');
var imagesrc[i] = chrome.extension.getURL('image.png');
jQuery.ajax({
url: some_link,
dataType: "html",
cache: false,
success: function (data) {
href = jQuery(data).find('#link_i_want').attr('href');
var linked_image = '<a href="' + href + '"><img src="' + imagsrc + '"></a>';
jQuery(linked_image).insertAfter(refLink);
}
});
};
var href, imagesrc = [];
jQuery(function ($) {
$('#list_of_links li').each(function (i) {
ajaxLoop(i);
});
});
如果不对此进行测试,我认为您的问题可能是:
当您运行锁步时,refLink
将始终具有您想要的值。 但是,当您进行异步翻录时,可以更快地通过循环refLink
因此在运行 ajax 调用时会发生变化。 您需要为每次调用捕获该值。
一个可能的解决方法是放入另一个函数来进行 ajax 调用,以便捕获所需的值。
另一个问题是link
从哪里获得价值?
我假设如果您查看浏览器开发人员工具中的网络流量,您会看到所有请求都消失了,但处理出了问题。
- 异步并行错误
- Fresh Spark Install+Homestead上的Vue异步堆栈跟踪错误
- 异步面板绑定错误
- 在照片查看器(Javascript和jQuery)中异步加载图像时可能出现错误
- 从 Ajax 获取由 ZombieJS 的异步点击事件触发的 Http 错误
- Node.js异步并行“;类型错误:任务不是函数;
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 基准测试引发错误的异步与同步代码
- 使用异步代码引发/捕获错误的替代方法
- Gulp 4 迁移错误(您是否忘记发出异步完成信号?
- 异步函数中的回调和错误处理
- 异步函数抛出错误:套接字挂起
- 如何在异步操作期间使 Express.js 日志错误
- 如何在不出现异步错误的情况下加载 Gist 代码
- 量角器根据条件单击嵌套元素,错误 - 在指定的超时内未调用异步回调
- 如何通过期望的测试.js异步完成()采取错误
- 如果错误可重试,请重试异步函数
- AJAX调用顺序错误(异步)javascript
- 在Node.js中短路非错误异步流的模式
- 在JS中,如何捕获用户定义函数抛出的错误? '异步调用