如何在 JavaScript 中按顺序执行这两个不同的代码块?

How do I execute these 2 different blocks of code in a sequence in JavaScript?

这是我路线中的代码:

const hotspots = await Hotspot.find({user: req.user._id});
    if(!hotspots) return res.render("hotspot");
    let hotspotData = [];
    let rewards = [];
function getApiData(){
        return new Promise((resolve,reject)=>{
            let error = false;
            for (let hotspot of hotspots){
                axios.get(`https://api.helium.io/v1/hotspots/${hotspot.hotspot}`)
                    .then((resp)=>hotspotData.push(resp.data));
                
                axios.get(`https://api.helium.io/v1/hotspots/${hotspot.hotspot}/rewards/sum`)
                    .then((resp)=> {
                        console.log("first console log",resp.data.data.total)
                        rewards.push(resp.data.data.total) ;
                        console.log("Data gained from axios",resp.data.data.total);
                    })
                
            }
            if(!error) resolve();
            else reject("Something went wrong");
        })
    }

 getApiData().then(()=> {
        console.log(hotspotData);
        console.log(rewards);
        res.render("hotspot",{hotspots: hotspotData, rewards: rewards});
    });

其他一切都很好,但是当我记录 hotspotDatarewards 时,我得到一个空数组,但如您所见,我已经推送了从APIs 分别到那些数组。但是仍然;;我得到空数组。请帮我。我已经记录了 API 数据,是的,它发送了正确的数据,但我不知道为什么数据没有被推送到数组。

编辑:这是表明我的代码没有按照我想要的方式执行的输出:

这里发生的是在 axios 响应到达之前执行发回响应的代码:

  • 首先,使用 async/await 方法调用数据库(正确吗?)。
  • 然后定义一个 return 是 Promise 的函数,并调用它来处理 then() 函数中的响应。
  • 当 Promise 为 resolve()d 时执行该段代码(注意没有处理拒绝响应的代码)。
  • 现在,一旦 for 循环结束,promise 就解决了,它不会等待 对于 axios 对 return 的承诺,它只是触发请求并且 继续。 他们return之后的代码块稍后将是运行。

如果你想解决这个问题,你可以做的一件事是到处使用 async/await,并按顺序进行调用,就像这样:

const hotspots = await Hotspot.find(...);

function async getApiData() {
    let hotspotData = [];
    let rewards = [];
    for loop {
        hotspot = await axios.get(hotspot)
        reward = await axios.get(reward)
        ...
        // add both to the arrays
    }
    return { hotspotData, rewards }
}

const { hotspotData, rewards } = await getApiData();
console.log(hotspotData);
console.log(rewards);
res.render("hotspot",{hotspots: hotspotData, rewards: rewards});

注意:上面的代码比真正的代码更伪javascript好吗?

我认为这可能是一本有趣的读物:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await

另外,注意所有的 axios 调用似乎是相互独立的,所以也许你可以异步地 运行 它们,并等待所有的 promise 被解决以继续。查看此以获取更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all (首先确保它按顺序工作)

我认为它应该类似于一系列承诺(每个热点一个,for 循环中的奖励),然后 return 像这样:

return Promise.all([promise1, promise2, promise3]);