Как получить async / await для ожидания заполнения моего вложенного массива - PullRequest
0 голосов
/ 21 января 2019

У меня проблема с отображением массива и данных «arrayOfResults», но когда я пытаюсь получить доступ к определенной части массива, появляется сообщение undefined.Я знаю, что это как-то связано с асинхронным вызовом, потому что, если я помещаю console.log в тайм-аут, он отображается правильно.Я довольно плохо знаком с асинхронными вызовами в целом, не говоря уже о ожидании.Спасибо за помощь!

async function convertToCSV() {
        var userInput = document.getElementById("policyList").value; //value from text area
        var arrayOfUserInput = userInput.split('\n').map(str => str.replace(/\s/g, '')); //converts userInput to array and removes whitespace
        var arrayOfResults = new Array();

        //iterates for how many user inputs are recorded into arrayOfUserInput
        for(i = 0; i < arrayOfUserInput.length; i++){
       //awaits for each result of retrieve data before inputing into arrayofresults
         arrayOfResults[i] = await retrieveData(arrayOfUserInput[i]);

        }
        //*****THIS IS THE PART NOT WORKING CORRECTLY****
       console.log(arrayOfResults[0][0]);
     }

     async function retrieveData (clientRecord){
        //pulling data from retrieve_policy API
        var request = require("request");
        var resultsArr = new Array();
        var options = { method: 'POST',
        url: 'https://alamance.britecorepro.com/api/v2/policies/retrieve_policy',
        body: '{\n\t"api_key": "7f37b0b074cedffe559b8fabc0244*****e52bff6eb31205e9d9f442",\n\t"policy_number": "' +clientRecord+ '"\n}' };

        request(options, function (error, response, body) {

        var resData = JSON.parse(body);   //stores json response into object

        //checks to see if record exists, if not then it stores API provided error message
        if(resData.data.policy_number !== undefined){
           var credCheckLength = resData.data.active_revision.named_insureds[0].credit_reports.length //holds array length of credit checks
           var policyNumber = resData.data.policy_number; //policy number
           var name = resData.data.active_revision.named_insureds[0].name; //name
           var creditScore = resData.data.active_revision.named_insureds[0].credit_reports[credCheckLength-1].score; //credit score
           var creditCheckDate = resData.data.active_revision.named_insureds[0].credit_reports[credCheckLength-1].date_updated; //date,time credit score updated
           resultsArr[0]=policyNumber, resultsArr[1]=name, resultsArr[2]=creditScore, resultsArr[3]=creditCheckDate; //to insure proper order on return
        }
        else{
           resultsArr[0] =resData.messages[0];
        }
        });
        return  resultsArr;

     }

Когда я console.log arrayOfResults [0], я получаю все данные правильно.

Когда я console.log arrayOfResults [0] [0] likeвыше я получаю неопределенное значение, если не введу тайм-аут для фактического ожидания результатов.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Чтобы прояснить взлом, ниже приведен простой пример с более ярким подходом async / await.

async function addOneInArray() {
  let arr = [1, 2, 3, 4, 5];
  let sumArr = new Array();
  for (let i = 0; i < arr.length; i++) {
    sumArr[i] = await add(arr[i]);
  }
  return sumArr;
}

function add(number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => { resolve(number + 1) }, 100)
  })

}

addOneInArray().then((result)=>{
    console.log("Sum element of an Array by 1 - ",result);
});
0 голосов
/ 21 января 2019
    return new Promise(function(resolve, reject) {
        request(options, function (error, response, body) {

        var resData = JSON.parse(body);   //stores json response into object

           if(resData.data.policy_number !== undefined){
             //...........
           } else{
               resultsArr[0] =resData.messages[0];
           }
           resolve(resultsArr);
        });
    });

я кодифицировал то, что Рэнди предложил вам, чтобы получить лучшую идею,

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