如何在快速get调用中解析来自异步函数的promise

时间:2018-03-19 19:35:59

标签: reactjs express axios

我有一个使用express.get()创建的api调用,里面也调用异步函数来返回axios.get()请求。 getTwitterData()异步函数仅返回promise pending。我该如何解决这个问题?

'use strict';
 const axios = require('axios');
 const express = require('express');
 const app = express();
 const jwt = require('express-jwt');
 const jwks = require('jwks-rsa');
 const cors = require('cors');
 const bodyParser = require('body-parser');

 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({ extended: true }));
 app.use(cors());

 const auth = `OAuth oauth_consumer_key="D1X5bwx6tF5rNcC9J6iPDfhqP",oauth_token="4686534691-KcECHY2gBOtIqSAKrCYVFDKpOgkb1yNw5e3CCwk",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1521437993",oauth_nonce="peQkEX9wZZM",oauth_version="1.0",oauth_signature="U%2FG%2BLtMLOWQPUO3tHmwZk0iBrgY%3D"`;
 const url = `https://api.twitter.com/1.1/users/search.json?q=singer`;


 app.get('/api/twitter/data', (req, res) => {
   const tData = getTweetData().then((data)=>{
     return data;
   });
   console.log("tData: ", tData);
   res.json({tData});
 })

 async function getTweetData() {
   try{
     const data = await axios.get(url, { headers: { Authorization: auth }                     });
     return data;
   }catch(err){
     console.log(err);
   }
 }

 app.listen(3333);

 console.log('Listening on localhost:3333');

1 个答案:

答案 0 :(得分:1)

问题是getTweetData()实际上返回了一个承诺,这就是tData出现为承诺未决的原因。异步函数将返回Promise,您可以在MDN

上了解有关此内容的更多信息

不再使用异步,我们可以在下面

 app.get('/api/twitter/data', (req, res) => {
   const tData = getTweetData().then((data)=>{
     return data;
   });
   console.log("tData: ", tData);
   res.json({tData});
 })

并更改它以处理在promise解析时将获得的响应数据。

app.get('/api/twitter/data', (req, res) => {
       getTweetData().then((data)=>{
         //we have the data so just send the res here
         res.json({data});
       });
     })

另一种方法是更改​​用于Express API端点的匿名函数以使用异步。注意:我不确定Express是否支持这一点,我只是在演示如何使用异步函数

来编写它
   app.get('/api/twitter/data', async (req, res) => {
       const tData = await getTweetData()
       console.log("tData: ", tData);
       res.json({tData});
     })