2009-04-20 8 views
6

У меня есть функция javascript, которая вызывает общую функцию для вызова ajax на сервер. Мне нужно получить результат (true/false) из функции обратного вызова вызова ajax, но результат, который я получаю, всегда «неопределен».Содействовать обратному вызову возвращаемого значенияSuccess для возвращаемого значения функции Caller

супер-упрощенный вариант обобщенной функции без вся моя логика была бы:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        return true; 
       else 
        return false; 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

И функция, вызывающая это будет что-то вроде:

function Next() { 
     var result = CallServer("/Signum/TrySave"); 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    } 

«результат» Переменная всегда «undefined», и отлаживая его, я вижу, что выполняется строка «return true» функции обратного вызова.

Любые идеи, почему это происходит? Как я мог бы вернуть возвращаемое значение из функции обратного вызова функции CallServer? bubble?

Благодаря

ответ

0

Только что нашел, как это сделать :) Объявление переменной и ее обновление соответственно из функции обратного вызова. Впоследствии я могу вернуть эту переменную. Я помещаю код для будущих читателей:

function CallServer(urlController) { 
    var returnValue = false; 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic){ 
        returnValue = true; 
        return; 
       } 
      }, 
     error: 
      function(errorThrown) { 
       alert("Error occured: " + errorThrown); 
      } 
     }); 

     return returnValue; 
} 
+10

Хотя это может работать для вас, это непредсказуемый код, потому что вы, скорее всего, вернете «returnValue» с CallServer до того, как async POST установит его значение. Правило большого пальца: не обматывайте асинхронные вызовы в синхронных оболочках! –

+0

вы можете заглянуть в $ .when для ожидания ожидания асинхронных вызовов http://api.jquery.com/jQuery.when/ – Andbdrew

0

Я обычно ставлю любой код, который будет выполняться на успех внутри самой функции обратного вызова. Я не думаю, что CallServer() фактически получает возвращаемые значения из самих обратных вызовов.

Попробуйте что-то вроде:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        document.forms[0].submit(); 
       else 
        // do something else 
      }, 
     error: 
      function(errorThrown) { 
       // handle error 
      } 
    }); 
} 

Edit: Я не слишком хорошо знакомы с JQuery, так что я мог бы совершенно неправильно (я основывая это на поведение других структур, как YUI, и AJAX звонки без каких-либо фреймворков). Если да, просто запустите этот ответ и оставьте комментарий, и я удалю этот ответ.

+0

Ничего страшного в ответе Кальвина;) Проблема в том, что это универсальная функция для целей проверки, поэтому я не могу поставить код там как что делать, если проверка прошла. Мне нужно как-то заставить Callserver вернуть логическое значение. Cheers anyway – antonioh

15

Только в случае, если вы хотите идти асинхронный путь (который является лучшим решением, потому что он не замерзнет ваш браузер, делая запрос), вот код:

function CallServer(urlController, callback) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: true, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       var ret = (someLogic); 
       callback(ret); 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

function Next() { 
    CallServer("/Signum/TrySave", function(result) { 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    }); 
} 
+0

Моя функция должна быть синхронизирована, но я не знал, как вернуть значения, которые может быть полезно когда-нибудь, так что спасибо! – antonioh