请教下async/await如何应用在http.request的业务中?
发布于 6 年前 作者 wldlzt 12207 次浏览 来自 问答

目前async/await已经在开发上全面使用,但遇到一个很具体的技术问题,代码如下 var post_req = http.request(post_option, function(resa){ resa.on(‘data’, function(buffer){ ret += buffer.toString(); }); resa.on(‘end’, function(){ console.log(ret); }); }); post_req.write(post_data); post_req.end();

想问的是我如何把上述代码利用async/await包装在一个fn函数里,直接通过调用函数var ret=fn();就能获取到ret的输出结果?

12 回复

这样是否能够满足你的需求呢?

let p = new Promise((resolve, reject)=>{
    var post_req = http.request(post_option, function(resa){
        resa.on(‘data’, function(buffer){
            ret += buffer.toString();
        });
        resa.on(‘end’, function(){
            return resolve(ret);
        });
        });
        post_req.write(post_data);
        post_req.end();
        //...err reject(err)
})
// await p 获取ret

来自于 bs32g1038 LIZCBLOG博客

@bs32g1038 谢谢,可以~~~

@bs32g1038 不好意思,用上Promise还是无法直接封装函数并返回请求结果,有没办法只用async/await的呢?

貌似你的代码有问题,ret在哪里定义过?

var http = require('http');
var util = require('util');
const request = util.promisify(function(post_option, cb){
	var post_req = http.request(post_option, function(resa){
		let ret = '';//这里考虑用数组,然后 Buffer.concat(array)会比较好,先沿用你的写法
		resa.on(‘data’, buffer=>{ret += buffer.toString()});
		resa.on(‘end’,()=>cb(null,ret));
		resa.on('error',(err)=>cb(err))
	});
	post_req.write(post_data);
	post_req.end();
})

(async ()=>{
	const ret = await request(post_option);//your post_option
	console.log(ret);
})()

@fantasticsoul 谢谢您先~~~~ret是我定义少了…然后您发的代码我试运行了一下,是报promisify(…)(…) is not a function的错误,当然我也去了解了promisify的用法,正在摸索中,您发的代码是少了什么吗?

@wldlzt 示例代码:

const http = require('http')
const options = {
    hostname: 'cnodejs.org',
    port: 80,
    path: '/',
    method: 'get'
};
let request = function(options) {
    // 注意返回promise对象
    return new Promise((resolve, reject) => {
        const req = http.request(options, (res) => {
            let ret = '';
            res.on('data', buffer => { ret += buffer.toString() });
            res.on('end', () => resolve(ret));
        });
        req.on('error', (e) => reject(e));
        req.end();
    });
};

(async () => {
    console.log(await request(options))
})();

@bs32g1038 谢谢谢谢代码没问题,但我发现业务上是我自己设计思路搞错了…

请直接使用 httpx、urllib 之类的模块。

原生模块用起来比较麻烦… 优先考虑 fetch request(promisify 版本) urllib 等

@wldlzt 你的node不是v8版本吗?v8.*才有 promisify方法在util里

我自己也封装了一个,可以参考下。 https://github.com/LeoHughes/InterfaceProxy

回到顶部