2013-03-06 2 views
4

Я хочу подождать, пока вызов ajax будет завершен и вернет значение.Подождите, пока не будет выполнен запрос jquery ajax и возвращенное значение

function isFileExists(url) { 
    var res = false; 
    $.ajax({ 
     type: "GET", 
     async: false, 
     url: url, 
     crossDomain: true, 
     dataType: "script", 
     success: function() { 
      res = true; 
     }, 
     error: function() { 
      res = error; 
     }, 
     complete: function() { 

     } 
    }); 
    return res; //It is always return false 
} 

Я хочу, чтобы вернуть значение "истина/ошибка"

Пожалуйста, помогите мне.

+1

рассмотрите возможность использования jquery-тега вместо javascript в следующий раз, чтобы он стал более конкретным и сэкономил время для людей. Спасибо – Toping

ответ

10

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

JQuery позволяет легко связать обратные вызовы (потому что jqXHR возвращаемый АЯКС методами Jquery в реализует Deferred):

var jqXHR = $.ajax({/* snip */}); 

/* millions of lines of code */ 

jqXHR.done(function() { 
    console.log('true'); 
}).fail(function() { 
    console.log('false'); 
}); 

P.S. вы можете делать то, что хотите, если вы установили async в false, но это блокирует браузер во время выполнения запроса. Не делай этого. Тогда у вас просто есть jax.

EDIT: Вы не можете комбинировать crossDomain: true и async: false. Перекрестный домен должен быть асинхронным.

+2

+1. Отсутствуют термины «Отложенные» или «Обещание», хотя :) –

+3

вы имеете в виду 'async' на' false' –

+1

@ GabyakaG.Petrioli да, вы правы. Я обновлю ответ –

0

может быть, это будет работать для вас:

function isFileExists(url, init) { 
    var res = null; 
    var _init = init || false; 

    if (!_init) { 
     _init = true; 
     $.ajax({ 
      type: "GET", 
      url: url, 
      crossDomain: true, 
      dataType: "script", 
      success: function() { 
       res = true; 
      }, 
      error: function() { 
       res = 'error'; 
      }, 
      complete: function() { 

      } 
     }); 
    } 

    if (res==null) { 
     setTimeout(function(){ isFileExists(url, _init); }, 100); 
    } else { 
     return res; 
    } 
} 

Я проверил это на короткое время, но не междоменное.

+0

не работает setimeout(), вызывающий снова и снова – Sagar

+0

Да, он должен вызываться до тех пор, пока не будет разрешен запрос ajax. Попробуйте добавить настройку «тайм-аут» к вызову ajax, установив ее на 1 минуту (возможно), как средство для выхода. – ssc892