Как сделать асинхронную функцию обычной синхронной функцией - PullRequest
0 голосов
/ 15 января 2019

Я бы использовал асинхронную функцию как обычную синхронную функцию, я пытался использовать await, но она все еще не работает. Где я ошибся?

const getScript = (url) => {
return new Promise((resolve, reject) => {
    const http = require('http'),
        https = require('https');

    let client = http;

    if (url.toString().indexOf("https") === 0) {
        client = https;
    }

    client.get(url, (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            resolve(data);
        });

    }).on("error", (err) => {
        reject(err);
    });
});

};

async function getBody(url) {

(async (url) => {
    return ("qwe" + await getScript(url));
})(url);

}

console.log(getBody('http://myurl.com/myapi'));


console.log("end");

Но он по-прежнему не загружает данные до «конца» console.log. Где я ошибся? Спасибо

Ответы [ 4 ]

0 голосов
/ 15 января 2019

Это потому, что вы не ожидаете результата. Вот когда IIFE было выполнено (асинхронно), он вернул обещание. Вы не ожидаете разрешения IIFE. Таким образом, вы должны просто добавить await перед IIFE, как -

async function getBody(url) {
    await (async (url) => { // add await before executing this function right away
        return ("qwe" + await getScript(url));
    })(url);
0 голосов
/ 15 января 2019

Попробуйте это (я пишу код из головы)

async function getBody(url) {
    let r = await getScript(url));
    return ("qwe" + r);
}

(async () => {
    let b = await getBody('http://myurl.com/myapi')
    console.log(b);
    console.log("end");
}) ();
0 голосов
/ 15 января 2019

Асинхронная функция не может быть преобразована в синхронную. a в асинхронный означает, что он не синхронный. async можно преобразовать в обычную функцию, но она все равно будет асинхронной.

Асинхронность заразна. Как только он async (на основе обещаний), предпочтительнее придерживаться потока управления обещаниями.

В какой-то момент должна быть функция async верхнего уровня, а async IIFE внутри getBody является избыточным. Должно быть:

async function getBody(url) {
    return ("qwe" + await getScript(url));
}

(async () => {
    console.log(await getBody('http://myurl.com/myapi'));
    console.log("end");
})()
0 голосов
/ 15 января 2019

будет ждать не асинхронно

async function getBody(url) {

(await (url) => {
    return ("qwe" + await getScript(url));
})(url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...