当我尝试将数据推送到我的阵列时,这不会保存数据

时间:2017-02-18 09:35:26

标签: javascript arrays promise

我有这段代码:

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

我想添加" splatshArtUrl"对我的阵列,但这不起作用,当我尝试打印数据时,这不打印任何东西,我不知道该怎么做,任何想法?

3 个答案:

答案 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数组上循环的印象,如果您想一次获取多个值,那么这不会起作用,因为您必须处理多个承诺。但这是另一个问题,我认为在询问之前你应该对自己进行更多的研究。