【问题标题】:how to get async webrequest result and use the result another function in nodejs如何获取异步webrequest结果并使用nodejs中的另一个函数
【发布时间】:2019-06-30 09:43:39
【问题描述】:

我正在尝试异步 webrequest,我想在另一个函数中使用返回数据。

request.js

var fetch = require('node-fetch')

async function postAsync(url)
{
    var response =await fetch(url, 
        {
            method: "POST",
            headers: {
                'Content-Type': 'application/json',
                'User-Agent': 'AirPlay/320.20',
                'Connection': 'keep-alive'
        },
        body: {},
        encoding: null
    });

    return await response;
}

module.exports = {
    postAsync
}

app.js

var request = require('./request');

var response=login();
showData(response.data);

async function login()
{
    var response=await request.postAsync("https://httpbin.org/post");
    return response;
}

function showData(data)
{
    console.log(data);
}

运行 app.js 得到“未定义”的结果。 如果我改变;

var response=login(); 

var response=await login();

我收到错误“等待仅在异步函数中有效”

【问题讨论】:

  • 更改 login() 中的最后一行,- 包含 await "return await response;"
  • 我改变了但没有工作。我收到“Promise { }”消息
  • 是的,您需要在异步函数中进行任何等待。当你运行最后一段代码时会发生什么?
  • 我想在每个轮换响应中将值发送到下一个函数。

标签: node.js async-await webrequest


【解决方案1】:

Node.js 目前不允许在异步函数之外使用顶级 await。此外,看起来async 函数在app.js 的范围和上下文中不是异步执行的,没有什么可以让节点进程知道等待login() 完成。

试试下面的

在 app.js 中

const request = require('./request');

// Immediately invoke the async function
const login = (async function() {
    const response = await request.postAsync("https://httpbin.org/post");
    // You could just do showData(response.data) here if your goal is just  to log it
    return response;
})();

var response = showData(response.json());

function showData(data) {
    console.log(data);
}

同样在您的request.js 文件中,return await response 没有任何意义,因为您已经在await 声明了变量。您也可以执行以下操作:

我正在尝试异步 webrequest,我想在另一个函数中使用返回数据。

request.js

var fetch = require('node-fetch')

async function postAsync(url) {
    return await fetch(url, 
        {
            method: "POST",
            headers: {
                'Content-Type': 'application/json',
                'User-Agent': 'AirPlay/320.20',
                'Connection': 'keep-alive'
        },
        body: {},
        encoding: null
    });
}

module.exports = {
    postAsync
}

【讨论】:

  • 我试过但没用。 “response.data”不等待请求结果,我得到错误“未定义”
  • @gokhansea 我进行了编辑。 response.data 不属于 node-fetch api。试试response.json()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2019-08-08
  • 2019-12-13
  • 2020-03-04
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多