2010-12-28 2 views
1

Стандартный AJAX запрос с JQuery:JavaScript/JQuery переменная проблема (возможно кэширование выпуска)

var globalTitle = ""; 
var pages = ["a", "b", "c"]; 

for (var i = 0; i < pages.length; i++) { 
    createpage(pages[i]); 
} 

function createpage(title) { 
    globalTitle=title; 
    console.log (globalTitle); //All looks good here 

    $.ajax({ 
     url: "createpage.php?id=" + title, 
     context: document.body, 
     success: success 
    }); 
} 

Успех() функция использует globaltitle именно поэтому я должен был объявить его глобальным.

В функции success(), хотя console.log (globalTitle); постоянно дает мне «а». Это похоже на назначение переменной, но затем кэшируется каждый раз, когда вызывается метод success().

Бывает в FF 4 и Chrome 8. Любые мысли?

Edit: Вот функция успеха():

function success(text) { 
    console.log (globalTitle); // always "a" 

    var div1 = "<div id=\"" + globalTitle + "\">"; 
    var text = "<a href=\"javascript:createpage('" + globalTitle + "')\">Retry</a> " + +text; 
    var div2 = "</div>"; 

    if ($("#" + globalTitle).length) { 
     $("#" + globalTitle).html(text); 
    } else { 
     $("#ajax").append(div1+text+div2); 
    } 
} 
+2

Вы можете отправить сообщение 'success()' – zsalzbank

+0

, как вы обновите globalTitle, похоже, что это должно произойти в вашем методе успеха. Отправьте этот метод, и мы сможем помочь – Baz1nga

+0

Добавлено: – bcoughlan

ответ

1

Я хотел бы сделать что-то вроде этого (в var xhr = и xhr.cpTitle биты являются ключевыми для этой работы). Это происходит потому, что globalTitle переписывается каждый раз, когда запрашивается страница (все до того, как ответ получен), поэтому он всегда будет иметь значение то, что было предложено в прошлом:

function createpage(title) { 

    console.log(title); 

    var xhr = $.ajax({ 
     method: "post", 
     url: "createpage.php", 
     data: { 
      id: title 
     }, 
     context: document.body, 
     success: success 
    }); 

    xhr.cpTitle = title; 

} 

function success(data, status, xhr) { 
    console.log(xhr.cpTitle); 
} 

Или это (обратите внимание, что success() является внутриcreatepage(), избегая эту проблему по-другому, создавая замыкание):

function createpage(title) { 

    function success(data, status, xhr) { 
     console.log(title); 
    } 

    console.log(title); 

    $.ajax({ 
     method: "post", 
     url: "createpage.php", 
     data: { 
      id: title 
     }, 
     context: document.body, 
     success: success 
    }); 

} 
+0

Пробовал первое решение, отлично работал. Огромное спасибо. Тем не менее, я все еще полностью озадачен поведением моего оригинального кода. – bcoughlan

1

проблема заключается в том, что createpage вызывается синхронно, но функция успех будет называться асинхронно, поэтому нет никакой гарантии, что globaltitle будет установлен на w побег успеха. Попробуйте сделать globaltitle global для создания страницы вместо всего скрипта.

function createpage(title) { 
    $.ajax({ 
     url: "createpage.php?id=" + title, 
     context: document.body, 
     success: function(data) { 
      console.log(title); 

      //you could call your success function here and pass it title 
      success(title); 
     } 
    }); 
} 
+0

Это была моя первая мысль, но я попытался использовать jquery с «async: false», поэтому он делает один запрос за раз ... тот же результат. Если я объявляю globaltitle в createpage(), success() не может найти его – bcoughlan

Смежные вопросы