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

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

问题描述:

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

function foo() { 
    if (sessionKey) { 
     performTask(); 
    } else { 
     authenciate(); 
     performTask(); 
    } 
} 

function authenticate() {  
    $.post(url, function(data) { 
     sessionKey = data.sessionKey; 
    }); 
} 

编辑:我也不想摆在身份验证()的回调函数performTask()作为身份验证()会从几个不同的函数调用。

+0

作为post'成功的回调函数 – Alfabravo 2012-02-29 03:42:36

+0

检查简化的更新。您可以让呼叫者为每次认证呼叫添加一点点。 – Meligy 2012-02-29 05:52:22

您可以将回调传递给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(); 
    }); 
}
+0

谢谢。这就是诀窍! – Jon 2012-02-29 03:54:41

+0

@ icu222much:这个答案在正确的轨道上,但是它缺少@ minitech的答案中的一个重要部分 - 在尝试调用之前检查回调是否传递给'authenticate'。 ('if(callback)callback();')否则,简单地调用'authenticate();'(没有回调)会抛出一个'ReferenceError'。我冒昧添加适当的检查。 – josh3736 2012-02-29 03:58:02

JQuery的AJAX调用具有回调函数(成功和错误)。您可以通过身份验证后的操作作为回调,以在身份验证完成后进行。

或者,您可以设置am选项使呼叫同步。

对不起链接到文档;我从我的电话发帖。只需谷歌“jquery.ajax”来查找文档。作为对编辑的响应,如果你想改变在调用之后发生的事情(或者什么也不做),你可以给你的authenticate方法一个参数作为回调函数,以个案为基础。

检查这个问题: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(); 
     }); 
    } 
} 
+0

-1; [**从不**使用同步AJAX调用](http://stackoverflow.com/a/7337091/201952)。 – josh3736 2012-02-29 03:47:20

传递回调使用jQuery的承诺接口authenticate()本身(见documentation):

function authenticate(callback) { 
    var rq = $.post(url, function(data) { 
     sessionKey = data.sessionKey; 
    }); 

    if(callback) { 
     rq.success(callback); 
    } 
} 

现在只需拨打authenticate(performTask),例如。