Node.js 节点JS在异步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

我有一个异步函数,当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调用获得结果并将其分配给
结果之前运行。
这是我们大多数人在开始学习并发概念时面临的一个常见问题

例如:

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(它应该输出),我相信问题出在路由器函数中?