Не удается получить доступ к данным или скопировать данные из XMLHttpRequest при синхронном javascript AJAX - PullRequest
0 голосов
/ 27 апреля 2020

Как получить доступ к информации, полученной от XMLHttpRequest, когда XMLHttpRequest является синхронным?

// JavaScript Pure and AJAX

    let data = [];
    let xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            let a = JSON.parse(this.responseText);
            let xhttp = new XMLHttpRequest(); //declear new obj in previus obj
            xhttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    let b = JSON.parse(this.responseText);
                    for (let i = 0; i < a.personInfo.length; i++) {
                        for (let j = 0; j < a.personInfo.length; j++){
                            if (a.personInfo[i].uid === b.additionalPersonInfo[j].uid) {
                                data[i] = Object.assign(a.personInfo[i], b.additionalPersonInfo[j])
                            }
                        }
                    }
                }
            };
            xhttp.open("GET", "https://api.npoint.io/dc6cb50568fac72a4105", true);
            xhttp.send();
        } //end bulid in obj
    };
    xhttp.open("GET", "https://api.npoint.io/177cea9c157de479d51b", true);
    xhttp.send();
    
    for (let o = 0; o < data.length; o++) {
          console.log(data[o]);
    }

Мне нужен доступ data[]

1 Ответ

0 голосов
/ 02 мая 2020
  1. Не следует использовать синхронный AJAX. Это устарело и даст плохой пользовательский опыт. Однако ваши ajax вызовы не являются синхронными в предоставленном вами коде.

  2. Ваш внутренний l oop должен проходить через b.additionalPersonInfo. Но вы пробегаете a.personalInfo и во внутреннем l oop.

  3. Вы должны поместить sh в свой массив data вместо того, чтобы пытаться добавить данные к еще не существующим элементам.

  4. Доступ к вашим данным возможен только из обратных вызовов, то есть только после того, как данные действительно доступны.


    let data = [];

    let xhttp = new XMLHttpRequest();

    xhttp.onreadystatechange = function () {

        if (this.readyState == 4 && this.status == 200) {

            let a = JSON.parse(this.responseText);

            let xhttp = new XMLHttpRequest(); //declear new obj in previus obj

            xhttp.onreadystatechange = function () {

                if (this.readyState == 4 && this.status == 200) {

                    let b = JSON.parse(this.responseText);

                    for (let i = 0; i < a.personInfo.length; i++) {
                        for (let j = 0; j <  b.additionalPersonInfo.length; j++){
                            if (a.personInfo[i].uid === b.additionalPersonInfo[j].uid) {
                                data.push(Object.assign(a.personInfo[i], b.additionalPersonInfo[j]))
                            }
                        }
                    }

                    //Here is the data -----> 
                    for (let o = 0; o < data.length; o++) {
                     console.log(data[o]);
                    }

                }
            };

            xhttp.open("GET", "https://api.npoint.io/dc6cb50568fac72a4105", true);
            xhttp.send();
        } //end bulid in obj
    };

    xhttp.open("GET", "https://api.npoint.io/177cea9c157de479d51b", true);
    xhttp.send();


...