使用 Async/Await 编写基于 Promise 的 HTTP 请求

Posted

技术标签:

【中文标题】使用 Async/Await 编写基于 Promise 的 HTTP 请求【英文标题】:Writing promise based HTTP request using Async/Await 【发布时间】:2018-01-22 22:17:08 【问题描述】:

是否可以重写 Node 手册中的以下 HTTP 请求示例以使用 Async/Await 而不是 Promise?我熟悉使用 resolve/reject 的 return new promise 方法,但更愿意使用 async/await。

    const postData = querystring.stringify(
      'msg': 'Hello World!'
    );

    const options = 
      hostname: 'www.google.com',
      port: 80,
      path: '/upload',
      method: 'POST',
      headers: 
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      
    ;

    const req = http.request(options, (res) => 
      console.log(`STATUS: $res.statusCode`);
      console.log(`HEADERS: $JSON.stringify(res.headers)`);
      res.setEncoding('utf8');
      res.on('data', (chunk) => 
        console.log(`BODY: $chunk`);
      );
      res.on('end', () => 
        console.log('No more data in response.');
      );
    );

    req.on('error', (e) => 
      console.error(`problem with request: $e.message`);
    );

    // write data to request body
    req.write(postData);
    req.end();

【问题讨论】:

你不能使用async/await代替承诺。您只能使用具有 async/await 语法的 Promise。 如果它是 Promise,请确保您可以使用 async/await 重写它 【参考方案1】:

您发布的代码不使用承诺(req 是一个事件发射器,更具体地说是一个ClientRequest 实例),所以不,您不能在这里使用async/await 语法。

我熟悉带有 resolve/reject 的 return new Promise 方法,但我更愿意使用 async/await

不,无论如何您都不能使用async/await 代替Promise constructor。您只能将其用作 then 调用的语法糖。

【讨论】:

感谢您的澄清。干杯

以上是关于使用 Async/Await 编写基于 Promise 的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 Async/Await 编写基于 Promise 的 HTTP 请求

简单理解JavaScript 的async/await

使用c#的 async/await编写 长时间运行的基于代码的工作流的 持久任务框架

Async/await:让异步编程更简单

在 JavaScript 中编写Go式错误处理的async/await

基于任务的异步编程(Task,async,await)