为什么我不能将数组的位置 0 与 __proto__ 一起使用?

Why am I not being able to use position 0 of an array with __proto__?

我无法使用代码中的数组。我不知道为什么 __proto__ 在那里

它看起来像一个普通的数组,但是当我想访问位置 0 (arr [0]) 的值时,控制台 returns "undefined".

这里是 javascript 代码:

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); 行比函数 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()来处理数据。

试试这个:

   

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 对象。给它一些时间来获取数据,你就可以得到结果。

   

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 时定义的。

在承诺上注册处理程序后,您无法立即访问承诺的结果(即其已实现的值),因为承诺代码 never 同步调用提供给它的处理程序.

当承诺被解决或拒绝时,承诺代码将作业放入承诺作业队列中执行处理程序(并监视它们的行为),将执行任务从队列留给事件循环管理器。

此演示显示数据未通过 then 在事件循环的同一调用中传输,但在返回事件循环后可用:

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 方法或在 async 函数内的承诺之前使用 await 来注册对数据承诺的回调。

显然在实际应用中,在服务器响应、浏览器收到回复并通知结果的脚本代码之前,服务器请求的数据也是不可用的。