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

时间:2012-02-29 03:40:05

标签: javascript jquery post

我有一个函数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()。

4 个答案:

答案 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();
        });
    }
}