如何在 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});
});
其他一切都很好,但是当我记录 hotspotData
和 rewards
时,我得到一个空数组,但如您所见,我已经推送了从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]);
这是我路线中的代码:
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});
});
其他一切都很好,但是当我记录 hotspotData
和 rewards
时,我得到一个空数组,但如您所见,我已经推送了从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]);