我有这段代码:
let splatshArtData = [];
splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
splatshArtData.push(splatshArtUrl);
});
console.log(splatshArtData);
我想添加" splatshArtUrl"对我的阵列,但这不起作用,当我尝试打印数据时,这不打印任何东西,我不知道该怎么做,任何想法?
答案 0 :(得分:0)
试试这个:
let splatshArtData = [];
splatshArt.getSplatchArt(participants[i].championId).then((splatshArtUrl) => {
splatshArtData.push(splatshArtUrl);
console.log(splatshArtData);
});
then
内的函数在异步函数getSplatchArt
解析它的承诺之后立即运行,因此它在项目添加到数组之前运行console.log
。
答案 1 :(得分:0)
您在这里遇到的问题是getSplatchArt
会返回一个承诺,承诺需要时间来解决。因此,您永远不能保证splatshArtData.push(splatshArtUrl);
将在console.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);
});
答案 2 :(得分:0)
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数组上循环的印象,如果您想一次获取多个值,那么这不会起作用,因为您必须处理多个承诺。但这是另一个问题,我认为在询问之前你应该对自己进行更多的研究。