Почему я не могу использовать позицию 0 массива с __proto__? - PullRequest
0 голосов
/ 14 июля 2020

Я не могу использовать массив, который у меня есть в коде. Понятия не имею, почему здесь __proto__

image

const apiUrl = 'https://api.covid19api.com/dayone/country/south-africa';
async function getData(){
  const response = await fetch(apiUrl);
  const data = await response.json();
  const arr = data.reduce((acc, cur) => cur.Confirmed ? [...acc, cur.Confirmed] : acc, []);
  return arr;
}

var res = [];
getData().then( val => {
  res.push(val);
})  

console.log(res);

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Это потому, что строка console.log(res); завершается быстрее, чем функция getData().

const apiUrl = 'https://api.covid19api.com/dayone/country/south-africa';
async function getData(){
  const response = await fetch(apiUrl);
  const data = await response.json();
  const arr = data.reduce((acc, cur) => cur.Confirmed ? [...acc, cur.Confirmed] : acc, []);
  return arr;
}

var res = [];
getData().then( val => {
  res.push(val);
  console.log(res);
  console.log(res[0]);
})  

Поместите оператор в функцию getDate() или снова используйте .then() для обработки данных позже.

0 голосов
/ 14 июля 2020

Вы не можете получить доступ к результату обещания (т.е. его выполненному значению) сразу после регистрации обработчика для обещания, потому что код обещания never вызывает обработчики, предоставленные ему синхронно.

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

Это демонстрация показывает, что данные не передаются then в том же вызове из события l oop, но могут быть доступны после возврата к событию l oop:

let dataPromise = new Promise( resolve => resolve("hello, I'm data"));

var res=[];
res.ready = false;

dataPromise.then(data => {
   res.push(data);
   res.ready = true;
});

function processData() {
   console.log(
     "ready: %s", data: %s",
     res.ready, res[0]);
}
processData(); // won't work

setTimeout( processData, 20); // will work

Данные, полученные с помощью обещания, доступны только через интерфейс обещания. Код, использующий данные, может зарегистрировать обратный вызов для обещания данных, вызвав метод then обещания или используя await перед обещанием внутри функции async.

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

0 голосов
/ 14 июля 2020

   

const apiUrl = 'https://api.covid19api.com/dayone/country/south-africa';
async function getData(){
  const response = await fetch(apiUrl);
  const data = await response.json();
  const arr = data.reduce((acc, cur) => cur.Confirmed ? [...acc, cur.Confirmed] : acc, []);
  return arr;
}

var res = [];
function showData(callback){
  getData().then( val => {
  res.push(val);
  callback();
    });
}
 
showData( function(){
  console.log(res[0])
});
Вот еще одно решение, почти такое же, как у TmasYIN. вы можете добавить функцию обратного вызова, которая выполняется внутри функции .then (), и эта функция обратного вызова определяется при выполнении showData.
0 голосов
/ 14 июля 2020

Попробуйте следующее:

   

const apiUrl = 'https://api.covid19api.com/dayone/country/south-africa';
async function getData(){
  const response = await fetch(apiUrl);
  const data = await response.json();
  const arr = data.reduce((acc, cur) => cur.Confirmed ? [...acc, cur.Confirmed] : acc, []);
  return arr;
}

function showData(callback){
  getData().then( val => {
  res.push(val);
  
    });
  setTimeout(function() {
        
       callback();
        
    }, 1500);
  
}
 
showData( function(){
  console.log(res[0])
});

proto - это встроенный javascript указатель наследования объекта, который указывает на его родителя. (В javascript функция также является объектом). В вашем примере getData () наследуется от AsyncFunction, поэтому, если вы вызываете getData (). proto , он дает вам объект AsyncFunction. Вы можете получить результат после того, как дадите ему время для выборки данных.

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