Javascript 当尝试将数据推送到我的阵列中时,请不要';我不能保存数据

Javascript 当尝试将数据推送到我的阵列中时,请不要';我不能保存数据,javascript,arrays,promise,Javascript,Arrays,Promise,我有以下代码: let splatshArtData = []; splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => { splatshArtData.push(splatshArtUrl); }); console.log(splatshArtData); 我想将“splatshartur”添加到我的数组中,但这不起作用,当我尝试打印数据时,这

我有以下代码:

let splatshArtData = [];
splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
    splatshArtData.push(splatshArtUrl);                 
});
console.log(splatshArtData);
我想将“splatshartur”添加到我的数组中,但这不起作用,当我尝试打印数据时,这不会打印任何内容,我不知道如何做,知道吗

试试这个:

let splatshArtData = [];
splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
    splatshArtData.push(splatshArtUrl); 
    console.log(splatshArtData);                
});

中的函数在异步函数
getSplatchArt
解析其承诺后立即运行,因此它在将项添加到数组之前运行
控制台.log

这里面临的问题是
getSplatchArt
返回承诺,承诺需要时间来解决。因此,您永远无法保证
splatshArtData.push(splatshartur)将在
控制台.log
之前运行

解决方案是将需要从promise返回数据的所有逻辑移到promise回调中。这当然可以包括对其他函数的调用

// function to process the splashArtData - will be called from the promise
// when the promise is resolved.
function processSplashArt(data) {
  // this will now print as you are expecting
  console.log(data);
}

let splatshArtData = [];

splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
  splatshArtData.push(splatshArtUrl);    

  // pass the splashArtData to the callback function - it's now ready
  processSplashArt(slashArtData);         
});

JavaScript是同步的,因此每一行代码都将一行接一行地执行

如果我们用下面的行号注释代码

1. let splatshArtData = [];
2. splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
3.     splatshArtData.push(splatshArtUrl);                 
   });
4. console.log(splatshArtData);
您假设它将按1、2、3、4的顺序运行,而实际上它将按1、2、4、3的顺序运行。为什么呢?因为JavaScript是同步的,第2行的函数是异步的,这意味着您必须等待它,然后才能继续。如果不这样做,
splatshArtData
变量将是一个空数组,因为数据尚未提取

如果您希望返回提取的数据并在另一个函数中使用它,则不应将它与另一个答案中建议的回调混合在一起,而应链接承诺并使用从提取数据的函数中解析的值

function getSplatshArt() {
    let splatshArtData = [];

    //Return a promise
    return splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
        console.log(splatshArtData); //this will log out the data
        splatshArtData.push(splatshArtUrl);  
        return splatshArtData; //this will be the resolved value from the promise 
    });
}

//Call the function and access the resolved data in the .then() block
getSplatshArt()
    .then(data => {
        console.log(data); //this is the data returned from the getSplatshArt function
    });

看看你的代码,我得到的印象是你在一个ID数组上循环,如果你想一次获取多个值,这是行不通的,因为你必须处理多个承诺。但这是另一个问题,我认为在问这个问题之前,你应该做一些自己的研究。

什么是
.save
方法?@Alexandru IonutMihai哦,没什么,一个肮脏的代码:p移动你的
控制台.log(splatshArtData)编码到
.then()
块中,它就会工作。您的函数调用是异步的,但您将其视为同步的,因此会出现错误。另一种方法是使用
回调
函数。回调将消除使用承诺的需要,以及代码的许多优雅之处。这不是真的正确。当然这是可行的,但是
.then()
中的函数显然不是“在异步函数之后”运行的。当从
getSplatchArt
返回的承诺得到解决时,它将运行,这可能是在之后,但也可能是10分钟之后。我不想让他感到困惑,因为他似乎不理解承诺的作用。好吧,你应该清楚它是如何工作的,因为你现在的回答是不正确的。