Node JS在异步json调用中返回未定义的状态

问题描述 投票:0回答:1

我有一个异步函数,在连接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)



});  
node.js asynchronous superagent
1个回答
0
投票

之所以令人遗憾,是因为您的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)
    });

}
© www.soinside.com 2019 - 2024. All rights reserved.