Как заставить сценарий ждать статуса запроса на получение Ajax, прежде чем продолжить?

StackOverflow https://stackoverflow.com/questions/2431567

  •  19-09-2019
  •  | 
  •  

Вопрос

По сути, я проверяю существование объекта. Если он не найден, скрипт попытается загрузить исходный файл с помощью getScript.Я хочу проверить это только один раз, а затем вернуть true или false функции, которая вызывает fetch().

  fetch:function(obj){
      ...
        isReady = false;
   $.getScript(obj.srcFile,function(){

    isReady=true;
    warn("was able to load object "+key);

   });

   return isReady;

   }

но возврат срабатывает до загрузки скрипта =/

позже скрипт загружается, но функция возвращает false.

Полагаю, в этом красота асинхронности...

Как лучше всего с этим справиться...Может быть, я мог бы еще раз проверить, существует ли объект в другом месте?

Или, может быть, есть лучший способ сделать это, при котором мне не придется блокировать браузер?

Это было полезно?

Решение

Судя по организации вашего кода, я предполагаю, что вы используете объект для хранения своих методов.Если да, то вы можете использовать пользовательские события следующим образом:

var thing = {
    fetch: function(obj){
        var self = this;
        if (obj.isReady){
            self.trigger('ready', [obj]);
            return;
        }
        $.getScript(obj.srcFile,function(){
            obj.isReady = true;
            self.trigger('ready', [obj]);
        });
    }   
};

thing.bind('ready',function(e, obj){
    // do what you need to do when the object exists here
});
var obj = {};
thing.fetch(obj);

Другие советы

Видеть jQuery.ajax():Делать async ЛОЖЬ.

По умолчанию все запросы отправляются асинхронно (т.по умолчанию установлено значение true).Если вам нужны синхронные запросы, установите для этой опции значение false.Обратите внимание, что синхронные запросы могут временно заблокировать браузер, отключив любые действия, пока запрос активен.

fetch:function(obj){
 isReady = false;
 $.getScript(obj.srcFile,function(script_data){

  isReady=true;
  warn("was able to load object "+key);
  if ( typeof( script_data ) != 'undefined' ) {
     return isReady;
  }

  });


 }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top