2015-09-10 4 views
0

У меня есть код, который дает проблему при возврате значения из вложенной функции.
проверьте этот код.возвращаемое значение из вложенной функции в jQuery

function test(){ 
    var flag=true; 
    $.post('path/of/file.php',{data:data},function(r){ 
    if(r == 1){ flag=false; } 
    }); 
     return flag; 
} 

эта функция test всегда возвращает true. потому что он возвращает значение без ожидания функции обратного вызова $.post. если я вернусь в функцию обратного вызова, это не сработает. так, как я могу преодолеть эту проблему.
спасибо ...

+0

Его совершенно неясно .. Вы хотите, чтобы вернуть значение, как только вы получите значение обратно из 'Post'? Но вы всегда возвращаете «правду»? и это не имеет смысла, независимо от того, получили ли вы значение из 'post'. Можете ли вы рассказать о сценарии? –

+1

Я думаю, вы должны вернуть 'return flag'; вместо 'return true' –

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous -call) –

ответ

0

Поскольку .post запускает async, ваш метод всегда будет возвращать true в настоящий момент. Но как насчет возврата объекта deferred? Я понимаю, что это другой подход, чем тот, который вы просите, и это может быть неприменимо для вашего сценария.

Нечто подобное (от верхней части моей головы):

function test(){ 
    var def = new $.Deferred(); 
    $.ajax({ 
     url: 'test', 
     success: function(data) { 
      // Do some minor logic to determine if server response was success. 
      console.log('success in callback'); 
      if(data == true){ 
       def.resolve(true); 
      } 
      else{ 
       def.reject(); 
       // or possibly def.resolve(true) depending what you're looking for. 
      } 

     }, 
     error:function(){ 
      console.log('error in callback'); 
      def.reject(); 
     } 
    }); 

    return def; 
} 

function testMethod(){ 
    var defObject = test(); 
    defObject.done(function(result){ 
    console.log('done in deferred'); 
    // Do something when everything went well. 

    }).fail(function(){ 
    console.log('error in deferred'); 
    // Do something when something went bad. 
    }); 
} 

$(document).ready(function(){ 
    testMethod(); 
}); 

Отложенный позволяет легко слушать асинхронное обратные вызовы. Это общий шаблон, когда вы хотите сделать некоторую логику после завершения запроса, но вы хотите отделить логику от самого запроса.

Некоторые другие примеры здесь: http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt2-practical-use

plunkr пример: http://plnkr.co/edit/LsNjfx4alNzshOQb2XAW?p=preview

+0

@smokesnes Я проверяю ваш код, но он дает ошибку 'uncaught typeError: не может прочитать свойство 'done' of undefined' – AzeemHaider

+0

@AzeemHaider вы пробовали пример Plnkr? Откройте консоль, и она напишет «Ошибка», так как запрос ajax не работает. Загружен ли jQuery? Можете ли вы написать новый $ .Deferred() в консоли? – smoksnes

+0

@AzeemHaider Я сделал небольшую корректировку кода и добавил больше протоколирования и удалил совершенно совершенно несвязанный код. – smoksnes

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