2012-03-13 3 views
0

Я пытаюсь вернуть true или false функции в зависимости от ответа функции AJAX внутри нее, но я не уверен, как мне это сделать.Как вернуть значение внутри функции AJAX родительскому в javascript?

(function($) { 
    $('#example').ajaxForm({ 
     beforeSubmit : function(arr, $form, options) { 

      var jsonStuff = JSON.stringify({ stuff: 'test' }); 

      $.post('/echo/json/', { json: jsonStuff }, function(resp) { 

       if (resp.stuff !== $('#test').val()) { 
        // Cancel form submittion 
        alert('Need to type "test"'); 
        return false; // This doesn't work   
       } 

      }, 'json'); 

     }, 
     success : function() { 
      alert('Form sent!'); 
     } 
    }); 
})(jQuery);​ 

Я сделал скрипку, чтобы проиллюстрировать это лучше:

http://jsfiddle.net/vengiss/3W5qe/

Я использую JQuery и Ajax формы в Malsup в плагин, но я считаю, что это поведение не зависит от плагина, мне просто нужно до return false до функции beforeSubmit в зависимости от запроса POST, поэтому форма не отправляется каждый раз. Может ли кто-нибудь указать мне в правильном направлении?

Заранее спасибо!

+5

Добро пожаловать в удивительный мир ** асинхронном **! Вы не можете этого сделать. – SLaks

+0

Возможный дубликат [jQuery: возвращаемые данные после успешного запуска ajax] (http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success) –

+0

FYI, если вы поместите свой код внутри обработчик 'ready', он уже передал' jQuery' в качестве первого аргумента, поэтому вы можете просто удалить непосредственный вызов функции: 'jQuery (function ($) {... code here ...});' –

ответ

6

Это не возможно сделать при работе с асинхронными функциями. Функция, которая вызывает post, вернется сразу же, когда обратный вызов ajax вернется в какой-то момент в будущем. Невозможно вернуть будущий результат из настоящего.

Вместо этого вам нужно выполнить обратный вызов исходной функции. Эта функция в конечном итоге будет вызываться с результатом вызова Ajax

var makePostCall = function(callback) { 
    $.post('/echo/json/', { json: jsonStuff }, function(resp) { 
    if (resp.stuff !== $('#test').val()) { 
     // Cancel form submittion 
     alert('Need to type "test"'); 
     callback(false); 
    } else { 
     callback(true); 
    }}, 'json'); 
}; 

Затем включите код, который ожидается быстрый ответ от makePostCall с использованием функции обратного вызова вместо.

// Synchronous version 
if (makePostCall()) { 
    // True code 
} else { 
    // false code 
} 

// Async version 
makePostCall(function (result) { 
    if (result) { 
    // True code 
    } else { 
    // False code 
    } 
}); 
0

вы можете поставить асинхра: ложный параметр для запроса Ajax, то вы можете контролировать будущее и отправить товару обратно результат к родителю. см следующие основные направления заключены в ***
дополню: функция (е, данные) {

//before upload file check server has that file already uploaded 
     ***var flag=false;*** 
     $.ajax(
      { 
       type: "POST", 
       dataType:'json', 
       url:"xyz.jsp", 
       ***async:false,*** 
       data:{ 
         filename : upload_filename, 
         docname : upload_docname, 
         userid : upload_userid, 
        }, 
       success:function(data) 
       { 
        ***flag=true;*** 
       }, 
       error:function(request,errorType,errorMessage) 
       { 
        alert ('error - '+errorType+'with message - '+errorMessage); 
       } 
     }); 

     ***return flag;*** 

     }