目前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的输出结果?
这样是否能够满足你的需求呢?
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