我有一个异步函数,在连接api时会调用它。这应该返回一些json,然后它将显示在页面的json响应中。在json响应中,我不确定。
这是我正在使用的代码:
const express = require('express');
const router = express.Router();
const superagent = require('superagent');
function getCyrpto(){
var result;
superagent.get('https://min-api.cryptocompare.com/data/v2/pair/mapping/exchange?e=Kraken')
.query({ api_key: 'xxxxxxxx'})
.end((err, res) => {
if (err) { return console.log(err); }
result = res.body;
});
setTimeout(() => {
console.log(result);
return result;
}, 2000)
}
router.get('/', (req, res, next) => {
crypto=getCyrpto()
setTimeout(()=> {
res.status(200).json({
message: 'geting cyrpto',
apiResponse: crypto
});
}, 2500)
});
之所以令人遗憾,是因为您的setTimeOut方法在api调用获取结果之前运行,并将其分配给result
。当我们开始学习并发概念时,这是我们大多数人面临的普遍问题。
例如:
console.log("a");
setTimeOut(()=>console.log("b"),1000);
console.log("c");
上述功能的输出将
a
c
b
这是因为setTimeout函数是一个承诺,这意味着您的nodejs在运行下一行之前不会等待它完成,它只会在后台处理setTimeout函数,当它完成时将调用给定的回调函数setTimeOut中的第一个参数。
您的解决方案应该是
function getCyrpto(){
var result;
superagent.get('https://min-api.cryptocompare.com/data/v2/pair/mapping/exchange?e=Kraken')
.query({ api_key: 'xxxxxxxx'})
.end((err, res) => {
if (err) { return console.log(err); }
result = res.body;
setTimeout(() => {
console.log(result);
return result;
}, 2000)
});
}