как получить результат асинхронного веб-запроса и использовать результат другой функцией в nodejs - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь выполнить асинхронный веб-запрос и хочу использовать возвращаемые данные в другой функции.

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);
}

runapp.js получает "неопределенный" результат.если я изменяю;

var response=login(); 

на

var response=await login();

Я получаю сообщение об ошибке «Ожидание действительно только в асинхронной функции»

1 Ответ

0 голосов
/ 06 февраля 2019

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 ingобъявление переменной.Вы также можете просто сделать следующее:

Я пытаюсь выполнить асинхронный веб-запрос и хочу использовать возвращаемые данные в другой функции.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...