如何从嵌套的ajax中出来

时间:2009-07-21 10:57:50

标签: javascript jquery

我有一个紧密耦合的javascript,其中有一系列if-else检查和多个ajax调用。 ajax调用是嵌套类型。我的问题是我在一个深度嵌套的ajax可调用函数中,我想优雅地从那里出来。

代码的片段是。

function showSubscriptionLightBox() {

$.get("/ajax/get_subscription_lightbox_content.php?feed_id=" + feedid, function(data) {

//Work on the data we receive... and check whether user is logged in.

if(userLoggedIn) {

//Make one more ajax call

$.get("/ajax/is_user_subscribed.php?feed_id=" + feedid, function(data) {

//Work on data again.... and check if user is subscribed.

if(userSubscribed) {

//Then there is popup which comes up, a part of same page and it has a button name "task".
document.getElementById('task').onclick = function() {

if(document.getElementById('email_mode').checked) {
$.ajax({
url : "ajax/is_user_email_verified.php?user_id="+userID,
success : function(data) {
  if(!data)
    return;

  var response;
    response = eval("response = " + data);

     if(!response)
         return;

     if(response['email_status'] == 0) {
        //Exit from here 
}}}

...... 代码的其他部分..

我想从javascript中优雅地退出,当响应['email_status'] == 0

请告诉我,怎么做?

我尝试了return语句,但它把我带到了封闭的函数,而不是在脚本之外。

谢谢,

阿米特

3 个答案:

答案 0 :(得分:0)

有一个有趣的技巧,你总是可以在JavaScript中使用它来逃避调用堆栈: setTimeout()。它在许多情况下都很有用,不仅如此,它还经常用于解决浏览器中与DOM事件相关的错误。

$.ajax(
{
   url: 'lol.php',
   success: function(data)
   {
       setTimeOut(function()
       {
            // Your code comes here
       }, 0); // 0 will ensure that it gets executed immediately
   }
});

答案 1 :(得分:0)

我知道使用Prototype你可以用try / catch块来做到这一点。您可以从其中一个内部函数中抛出一个对象,它将向上移动调用堆栈,以便其他函数进行拦截。

答案 2 :(得分:0)

对于它的价值,这里是我的一个应用程序的一些代码。它使用JSONP和AJAX同步记录。它首先从远程服务器获取一个对象ID数组。然后,它从主机服务器获取零索引处的对象id的记录。然后它将收到的记录发送到远程服务器。此时,它通过以递增的索引启动进程来继续该过程。它在索引到达数组末尾时终止。

(function( $ ) {
    $.getJSON( 'http://remote.com/admin/record_ids.js?callback=?', function( data ) {
        var set_record = function( index ) {
            if ( index < data.length ) {
                $.get( 'record_get.json', { contact_id: data[ index ] }, function( data ) {
                    $.getJSON( 'http://remote.com/admin/record_save.js?callback=?', data, function() {
                        set_record( index + 1 );
                    });
                }, 'json');
            }
        };
        set_record( 0 );
    });
})( jQuery );

正如你所看到的,当你想要优雅地出去时,你就是不要打电话。我无法想象为什么你不能只是回来停止你的代码。