【发布时间】:2021-12-07 08:41:30
【问题描述】:
我有以下代码:(代码运行没有问题)
function getValoresAcao(acoes) {
acoes.forEach(acao => {
getValorAcao(acao)
});
console.log("the end")
}
function getValorAcao(acao) {
url = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&parse_mode=HTML&symbol='+acao+'&apikey='+API_KEY
request(url, { json: true }, (err, res, body) => {
if (err) { return console.log(err); }
let contador = 0;
let valorDeDoisDias = [];
const dailyJsonObject = body["Time Series (Daily)"]
var objectKeysArray = Object.keys(dailyJsonObject)
objectKeysArray.forEach(function(objKey) {
var objValue = dailyJsonObject[objKey]
if (contador < NUMERO_DE_ELEMENTOS )
{
//console.log(dailyJsonObject);
const valorFechamento = objValue["4. close"]
console.log(valorFechamento);
contador = contador + 1
valorDeDoisDias.push(valorFechamento);
}
});
const textoDiferenca = getDiferencaEmPorcentagem(valorDeDoisDias);
let bigString = "" + acao + " | " + valorDeDoisDias[0] + " | " + textoDiferenca
request(urlTelegram + bigString, { json: true }, (err, res, bodyTelegram) => {
console.log(bodyTelegram);
})
});
}
function getDiferencaEmPorcentagem(valprDeDoisDias) {
let myString = ""
const valorDiaAnterior = valprDeDoisDias[0]
const valorDiaMaisRecente = valprDeDoisDias[1]
myString = (valorDiaAnterior - valorDiaMaisRecente ) / valorDiaMaisRecente * 100
myString = myString.toFixed(2)
console.log(myString)
return myString + "%"
}
但是代码 console.log("the end") 应该在请求完成后运行,但是当我启动代码时它运行,它没有等待请求完成了。
如何让代码的“结束”部分等待请求执行?
【问题讨论】:
-
这能回答你的问题吗? Understanding async/await on NodeJS
-
这是一个带有回调的异步问题。这里有很多事情要展开,但简而言之,您需要将 CB 传递给您的
getValorAcao函数,但还有更多,因为您的acaos.foreach没有阻塞 -
解决方法是将你的getValoresAcao方法转换为异步方法,并在getValoresAcao结束时调用console.log("the end")。你可以在这里找到更多developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/…
标签: node.js