如何在使用AJAX时控制JavaScript函数的顺序
How to control the order of JavaScript functions while using AJAX
我的设置
function ajaxLoadSth(value, attribute) {
$.post( url, value, function(response) {
// interpreting the response
var foobar = $('#foo') + $('.bar').find('.sth');
// print interpretation into DOM
container.append(foobar);
// do some funky stuff
doSomeFooWithDom();
checkSomeBarHere();
updateSomeValuesThere();
// now call the function again with different values
// THIS IS WHAT MY QUESTION REFERS TO **************
if ( true ) {
ajaxLoadSth(newValue, newAttribute);
}
});
}
我的问题
函数在//做一些时髦的事情-部分,一些DOM操作完成执行之前,不能调用自己-,但它确实完成了。
我的问题
- 为什么?是因为那些"时髦的东西"位于外部功能中吗?当涉及到同步执行时,这重要吗
- 我如何才能让"自己的调用"等到上面的东西完成
我已经考虑过通过设置全局变量和触发处理程序来告知它们已经准备好的函数。每次触发处理程序时,函数都会检查是否所有变量都设置正确,然后执行函数调用。那呢?
非常感谢您提前抽出时间!
尝试回调例如
doSomeFunkyStuff(callback){
//DO SOME FUNKY
callback();
}
function ajaxLoadSth(value, attribute) {
$.post( url, value, function(response) {
// interpreting the response
var foobar = $('#foo') + $('.bar').find('.sth');
// print interpretation into DOM
container.append(foobar);
// do some funky stuff
doSomeFunkyStuff(function(){
ajaxLoadSth(newValue, newAttribute);
}
});
}
-
功能是外部的这一事实并不重要。它们将同步执行:如果您使用DOM检查器并在这些函数中放置断点,您应该会发现它们将在AJaX调用调用之前按顺序执行。
-
我认为这里的关键是"等到上面的东西完成"——这些函数将按照您调用它们的顺序执行,但"完成"的结果可能是异步的。
我写了一个插件来处理这类东西,名为Pendant.js。其想法是,你想根据各种依赖关系推迟(一个或多个)给定函数的执行:dependency
是一个传递给Pendant的函数,它会得到一个额外的参数resolve
,这是一个在满足依赖关系时可以调用的函数。然后,您将递归调用作为dependant
传递,该调用只有在Pendant的所有依赖项都已解析时才会执行。
jQuery还实现了开箱即用的"Promises",这正是我想要的,但使用了一种适合XHR的语言,我对此感到不舒服。话虽如此,它可能要健壮得多(并且有充分的文档记录!),所以你可能应该看看。
相关文章:
- 更改CSS以允许使用Javascript控制DIV位置
- 如何使用相同的javascript控制表单中的不同元素
- 如何使用JavaScript控制数据库查询的响应顺序
- 删除"在JavaScript控制台中打印数组时
- SVG模式通过Javascript控制的滑块
- 为什么}!{ 在 JavaScript 控制台中导致 False
- 使用 JavaScript 控制 HTML 中的 mp3 播放
- 由 JavaScript 控制的 CSS3 单向转换在按顺序添加/删除类时不起作用
- Chrome 的 Javascript 控制台中的意外标识符
- 在 JavaScript 控制台中.log
- 显示javascript控制台中的消息
- 在javascript控制台上使用xpath
- 通过向动态id添加字符串,使用JavaScript控制文本框
- 从第三方原始javascript控制Angular JS元素
- 使用DDE通过Javascript控制Bloomberg-Object dos't支撑方法
- getElementById+getElementsByTagName在javascript控制台中给出Type错误
- 使用JavaScript控制iOS网络应用程序中列表的垂直滚动和水平滑动
- 使用javascript控制.mov(<object>)文件
- 是否可以将HTML呈现到Javascript控制台中
- 什么是 JavaScript 控制台中的 GET 错误