Как сохранить результаты асинхронной (AJAX) функции в переменной? - PullRequest
0 голосов
/ 26 июня 2019

Это не повторяющийся вопрос.

Это запрос на помощь в поиске технического заключения, который не рассматривается в Как вернуть ответ от асинхронного вызова?

Если .then () нетрешая обещание, как я могу отследить проблему в этот момент?Похоже, что я что-то упустил технически, а не концептуально.

Эта функция извлекает данные из URL:

async function getINFO(source, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", source);
    xhr.responseType = "document";
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200){
            var text = xhr.responseXML.getElementsByTagName('pre')[0].innerHTML;
            console.log(text);
            callback(text);
    }
  }
  xhr.send();
}

Внешне определенный обратный вызов:

function asyn_return(input){
  console.log(input);
  return input;
}

Данные поступаютобратно в AJAX.

Я хочу заполнить элемент атрибута (datastore.info) данными.

info - это строка URL.

Этопоместите в код, где я использую свою функцию извлечения данных AJAX:

if (typeof(info) === 'string'){
// If I have a URL retrieve the data and add it to the datastore object.
    datastore.info = getINFO(info, asyn_return).then(data =>{
      console.log(data);
      return data;
    });
    //console.log(datastore.info);
} else {
    datastore.info = "";
}

console.log(datastore.info);

console.log(data) возвращает ожидаемые данные, но datastore.info не заполнено:

{item1: "data", item2:"data", info: {} }

Не уверенчто мне не хватает технически , чтобы получить это разрешение для результата.

Как только у меня есть обещание (оболочка), что вызывает его разрешение?И когда это не происходит, что является вероятной проблемой?

Спасибо всем, кто может помочь.

1 Ответ

0 голосов
/ 26 июня 2019

Ваш console.log в конце предполагает, что данные поступают несинхронно, но это не так, поэтому он не определен, потому что данные ajax еще не получены.

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

Это можно записать так:

function getINFO(source) {
  return new Promise(resolve => {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', source);
    xhr.responseType = 'document';
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4 && xhr.status === 200) {
        var text = xhr.responseXML.getElementsByTagName('pre')[0].innerHTML;
        console.log(text);
        resolve(text);
      }
    };
    xhr.send();
  });
}

if (typeof info === 'string') {
  // If I have a URL retrieve the data and add it to the datastore object.
  getINFO(info).then(data => {
    console.log(data);
    datastore.info = data;
    // continue your async code here
  });
  //console.log(datastore.info);
} else {
  datastore.info = '';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...