如何使异步函数成为普通的同步函数

时间:2019-01-14 21:49:46

标签: javascript node.js async-await

我将异步功能用作普通的同步功能,我尝试使用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“ end”之前加载数据。我在哪里错了? 谢谢

4 个答案:

答案 0 :(得分:0)

异步功能不能转换为同步功能。 asynchronous 中的 a 表示它不同步。 async可以转换为常规函数,但仍将是异步的。

异步性具有传染性。一旦为async(基于承诺),最好坚持承诺控制流。

在某个时候应该有顶级async函数,并且async内部的getBody IIFE是多余的。应该是:

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

(async () => {
    console.log(await getBody('http://myurl.com/myapi'));
    console.log("end");
})()

答案 1 :(得分:-1)

将等待不同步

jdk.nashorn.api.scripting.NashornScriptEngine  scriptEngine =(NashornScriptEngine) factory.getEngineByName("nashorn");
ScriptContext context = scriptEngine.getContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x","Guest");
engine.eval("Hello, ${x}",context);

答案 2 :(得分:-1)

这是因为您没有等待结果。在执行IIFE(异步)时,它会返回一个Promise。您不是在等待IIFE解决。 因此,您应该简单地在IIFE前面添加一个等待,例如-

async function getBody(url) {
    await (async (url) => { // add await before executing this function right away
        return ("qwe" + await getScript(url));
    })(url);

答案 3 :(得分:-2)

尝试一下(我从头开始编写代码)

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