我有一个思想实验。在我的代码中,我有一个全局变量 var changeMe; 并且我进行了一些 Ajax 调用。
//call One -- third param is the callback function
ajaxFunction(url1, params,function(data){
changeMe = data;
});
//call Two
ajaxFunction(url2, params,function(data){
changeMe = data;
});
因此 changeMe 值将取决于哪个 Ajax 调用最后完成,这意味着最后完成的调用将覆盖该值。
如果两个调用完全在相同时间、相同时间戳完成怎么办?
由于 Javascript 是单线程的,我们通常不会遇到这个问题,但是在 setTimeout 和 Ajax 调用的情况下可能会出现这个问题。我不知道如何才能精确地复制这个问题,所以它仍然是一个思想实验。
那么在多线程条件下如何处理死锁?
我更喜欢像 changeMe 这样的答案是 url1 或 url2 ,以及一个清晰的情况解释..
提前致谢
最佳答案
Javascript 有一个事件队列。这意味着它会处理所有事件(用户触发的事件、setTimeout 事件、ajax 返回事件)一个接一个地处理。
你不能对执行顺序做出假设,这绝对不是正确的做法。 这并不意味着你不能进行同步。例如:
function processURLs() {
var url1 = "http://www.url1.com/";
var url2 = "http://www.url2.com/";
var data1 = null;
var data2 = null;
ajaxFunction(url1, params, function(data){
data1 = data;
if( data2 !== null ) {
process(data1, data2);
}
});
ajaxFunction(url2, params, function(data){
data2 = data;
if( data1 !== null ) {
process(data1, data2);
}
});
}
你说javascript是单线程的。那就对了。该线程不断循环,并在有事件要处理时从该队列中弹出事件。
即使调用完全在同一时间和相同的时间戳完成,也会有一个调用先于另一个调用进入此事件队列(因为您的系统将按某种顺序将消息传输到 javascript 进程)。
如果您想了解 javascript 计时器如何与该事件队列一起工作,我强烈推荐您阅读 John Resig's blog post about it
如果您想了解有关如何将网络事件传递到您的浏览器 (javascript) 的更多信息,您应该了解 OSI Model .
例如,您的浏览器位于 OSI 第 7 层(应用程序),但网络事件的顺序将在下面(第 3 至 6 层)决定。
因此总结一下答案:没有人能告诉您 changeMe 是 url1 还是 url2。 Javascript 不会在这里决定顺序,它会在更深层次决定(你的网卡,你的操作系统,等等)。
关于javascript - Javascript Ajax 会导致死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457930/
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是
下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson
我有一个ruby脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
我认为我对线程在ruby中的工作原理存在根本性的误解,我希望获得一些见解。我想要一个简单的生产者和消费者。首先,生产者线程从文件中提取行并将它们粘贴到SizedQueue中;当那些用完时,在末端贴上一些token,让消费者知道事情已经完成。require'thread'numthreads=2filename='edition-2009-09-11.txt'bq=SizedQueue.new(4)producerthread=Thread.new(bq)do|queue|File.open(filename)do|f|f.eachdo|r|queue现在有几个消费者。为简单起见,让