Node.js 节点JS在异步json调用中返回未定义
我有一个异步函数,当api连接到时调用它。这将返回一些json,然后它将显示在页面的json响应上。在json响应中,我没有定义 这是我正在使用的代码:Node.js 节点JS在异步json调用中返回未定义,node.js,asynchronous,superagent,Node.js,Asynchronous,Superagent,我有一个异步函数,当api连接到时调用它。这将返回一些json,然后它将显示在页面的json响应上。在json响应中,我没有定义 这是我正在使用的代码: const express = require('express'); const router = express.Router(); const superagent = require('superagent'); function getCyrpto(){ var result; superagent.get('h
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调用获得结果并将其分配给
结果之前运行。
这是我们大多数人在开始学习并发概念时面临的一个常见问题
例如:
console.log("a");
setTimeOut(()=>console.log("b"),1000);
console.log("c");
上述函数的输出将
a
c
b
这是因为setTimeout函数是一个承诺,这意味着您的NodeJ在运行下一行之前不会等待它完成,它将在后台处理setTimeout函数,当它完成时,它将调用作为setTimeout中第一个参数给定的回调函数
你的解决方案应该是
function getCyrpto(){
return new Promise((resolve,reject)=>{
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) { console.log(err); reject(err); }
result = res.body;
setTimeout(() => {
console.log(result);
resolve(result);
}, 2000)
});
}
router.get('/', (req, res, next) => {
getCyrpto().then(crypto=>{
setTimeout(()=> {
res.status(200).json({
message: 'geting cyrpto',
apiResponse: crypto
},2500);
}).catch(err=>{res.status(400).json(err)})
}
函数内的setTimeout
调用getCrypto
应该在.end({})
函数内。目前,它在异步调用完成之前运行。这是否回答了您的问题?好的,但是getCrypto中的console.log-in set-timeout确实输出了正确的数据,它输出了请求的Json(它应该输出),我相信问题出在路由器函数中?