【问题标题】:How to make async function to an ordinary synchronous function如何将异步函数变为普通同步函数
【发布时间】:2021-12-06 00:00:44
【问题描述】:

我会使用异步函数作为普通同步函数,我尝试使用 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 “结束”之前加载数据。我哪里做错了?

【问题讨论】:

标签: javascript node.js async-await


【解决方案1】:

异步函数不能转换为同步函数。 a 中的 a 表示它不是同步的。 async 可以转成普通函数,但还是异步的。

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

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

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

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

【讨论】:

    【解决方案2】:

    它将等待而不是异步

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

    【讨论】:

      【解决方案3】:

      这是因为你没有在等待结果。在这里,当 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);
      

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 2015-06-25
          • 1970-01-01
          • 2012-07-25
          • 1970-01-01
          相关资源
          最近更新 更多