Javascript 在调用函数之前执行异步调用

Javascript 在调用函数之前执行异步调用,javascript,jquery,post,Javascript,Jquery,Post,我有一个函数authenticate(),它使用$post()从我的服务器检索会话密钥。我相信$post是一个异步调用。每当我在脚本中执行任何操作时,我都希望确保我有一个sessionKey,如果我没有sessionKey,我希望进行身份验证()。我的问题是在调用autheniate()之后如何运行performTask() 编辑:我也不想加入authenticate()的回调函数performTask(),因为authenticate()将从几个不同的函数调用。JQuery的AJAX调用具有回

我有一个函数authenticate(),它使用$post()从我的服务器检索会话密钥。我相信$post是一个异步调用。每当我在脚本中执行任何操作时,我都希望确保我有一个sessionKey,如果我没有sessionKey,我希望进行身份验证()。我的问题是在调用autheniate()之后如何运行performTask()


编辑:我也不想加入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();
    });
}