我有一个函数authenticate(),它使用$ post()从我的服务器检索会话密钥。我相信$ post是异步调用。每当我在脚本中执行任何操作时,我都希望确保我有一个sessionKey,如果我没有sessionKey,我想验证()。我的问题是如何在调用authenicate()之后运行performTask()?
function foo() {
if (sessionKey) {
performTask();
} else {
authenciate();
performTask();
}
}
function authenticate() {
$.post(url, function(data) {
sessionKey = data.sessionKey;
});
}
编辑:我也不想放入authenticate()的回调函数performTask(),因为将从几个不同的函数调用authenticate()。
答案 0 :(得分:2)
使用jQuery的Promise接口将回调传递给authenticate()
(参见documentation):
function authenticate(callback) {
var rq = $.post(url, function(data) {
sessionKey = data.sessionKey;
});
if(callback) {
rq.success(callback);
}
}
现在只需拨打authenticate(performTask)
即可。
答案 1 :(得分:1)
您可以将回调传递给authenticate方法。如果从20个不同的地方调用身份验证,则可以传递20种不同的回调方法。
function foo() {
if (sessionKey) {
performTask();
} else {
authenciate(function() {
performTask();
});
}
}
function authenticate(callback) {
$.post(url, function(data) {
sessionKey = data.sessionKey;
if (callback) callback();
});
}
答案 2 :(得分:0)
JQuery的AJAX调用具有回调函数(成功和错误)。您可以将身份验证后操作作为回调传递,以便在身份验证完成后执行此操作。
或者,您可以设置am选项以使呼叫同步。
很抱歉没有链接到文档;我是通过手机发帖的。只需谷歌“jquery.ajax”找到文档。
* 编辑: *作为对编辑的回复,如果您想要更改调用后发生的事情(或什么都不做),您可以为authenticate方法提供一个参数,以用作回调函数根据具体情况而定。
答案 3 :(得分:0)
请检查此问题:How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?
它有一个同步执行AJAX的例子。基本上您传递的是async:false
参数,可能需要使用ajax()
方法而不是post()
快捷方式。
<强>更新强>
你可以做的另一件事是将整个事情包装在一个像:
这样的函数中function foo() {
authenciate(function() {
performTask();
});
}
function authenticate(callback) {
if (!callback) { return; }
if (sessionKey) {
callback();
} else {
$.post(url, function(data) {
sessionKey = data.sessionKey;
callback();
});
}
}