我试图创建一个基本的阻塞函数,一个需要在发出任何请求之前完成的初始化函数。但是,似乎没有任何内置的方法可以做到这一点 - 我希望像OCaML的Async库这样的东西。
答案 0 :(得分:0)
我不清楚你要做什么。如果你扩展你的问题,我会相应地调整我的答案。
以下是关于将异步/同步功能串联起来的几个一般想法:
可以将AJAX调用设置为同步,如下所示:
jQuery.ajax({
....
async: false
});
或者您可以使用promises(在jQuery中称为Deferreds)将依赖于顺序的异步调用串起来,如下所示:
var d1 = $.Deferred();
var d2 = $.Deferred();
$.when( d1, d2 ).done(function ( v1, v2 ) {
console.log( v1 ); // "Fish"
console.log( v2 ); // "Pizza"
});
setTimeout(function() {
d1.resolve( "Fish" );
}, 200);
setTimeout(function() {
d2.resolve( "Pizza" );
}, 300);
(以上示例改编自https://api.jquery.com/jQuery.when/)
另见How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?
答案 1 :(得分:0)
您可以在运行应用程序之前使用jQuery .when .then构造来确保一切准备就绪。
function longRunningAsynchronousAction() {
return $
.ajax({
url: "https://query.yahooapis.com/v1/public/yql",
dataType: "jsonp",
data: {
q: "show tables",
format: "json"
}
}).done(function() {
console.log('data loaded');
});
}
function initialize(onDoneFn) {
$
.when(
longRunningAsynchronousAction(),
longRunningAsynchronousAction(),
longRunningAsynchronousAction()
)
.then(onDoneFn);
}
function runApp() {
console.log('Starting app');
}
initialize(runApp);
示例为jsbin