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分钟之后。我不想让他感到困惑,因为他似乎不理解承诺的作用。好吧,你应该清楚它是如何工作的,因为你现在的回答是不正确的。