Javascript 在调用函数之前执行异步调用
我有一个函数authenticate(),它使用$post()从我的服务器检索会话密钥。我相信$post是一个异步调用。每当我在脚本中执行任何操作时,我都希望确保我有一个sessionKey,如果我没有sessionKey,我希望进行身份验证()。我的问题是在调用autheniate()之后如何运行performTask()Javascript 在调用函数之前执行异步调用,javascript,jquery,post,Javascript,Jquery,Post,我有一个函数authenticate(),它使用$post()从我的服务器检索会话密钥。我相信$post是一个异步调用。每当我在脚本中执行任何操作时,我都希望确保我有一个sessionKey,如果我没有sessionKey,我希望进行身份验证()。我的问题是在调用autheniate()之后如何运行performTask() 编辑:我也不想加入authenticate()的回调函数performTask(),因为authenticate()将从几个不同的函数调用。JQuery的AJAX调用具有回
编辑:我也不想加入authenticate()的回调函数performTask(),因为authenticate()将从几个不同的函数调用。JQuery的AJAX调用具有回调函数(成功和错误)。您可以将after authentication操作作为回调传入,以便在验证完成后执行该操作 或者,您可以设置am选项使调用同步 抱歉,没有链接到文档;我在用手机发帖。只需谷歌“jquery.ajax”就可以找到文档 *编辑:*作为对编辑的响应,如果您想逐个更改调用后发生的情况(或不执行任何操作),可以为您的authenticate方法提供一个参数作为回调函数使用。检查此问题: 它有一个同步执行AJAX的示例。基本上,传递一个
async:false
param,可能需要使用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();
});
}
}
使用jQuery的Promise接口将回调传递给
authenticate()
本身(请参阅):
例如,现在只需调用
authenticate(performTask)
。您可以将回调传递给authenticate方法。如果从20个不同的位置调用authenticate,则可以传入20个不同的回调方法
function foo() {
if (sessionKey) {
performTask();
} else {
authenciate(function() {
performTask();
});
}
}
function authenticate(callback) {
$.post(url, function(data) {
sessionKey = data.sessionKey;
if (callback) callback();
});
}
作为post“成功”时的回调函数,请检查简化的更新。您可以让调用者在每次经过身份验证的呼叫中只添加一点点@ICU222很多:这个答案是正确的,但是它缺少了@minitech的答案中的一个重要部分——在尝试调用回调之前,检查回调是否传递给
authenticate
。(if(callback)callback();
)否则,只需调用authenticate()
(不带回调)将抛出ReferenceError
。我冒昧地加了一张合适的支票。
function authenticate(callback) {
var rq = $.post(url, function(data) {
sessionKey = data.sessionKey;
});
if(callback) {
rq.success(callback);
}
}
function foo() {
if (sessionKey) {
performTask();
} else {
authenciate(function() {
performTask();
});
}
}
function authenticate(callback) {
$.post(url, function(data) {
sessionKey = data.sessionKey;
if (callback) callback();
});
}