我正试图把 http.request
包装成 Promise
:
new Promise(function(resolve, reject) {
var req = http.request({
host: '127.0.0.1',
port: 4000,
method: 'GET',
path: '/api/v1/service'
}, function(res) {
if (res.statusCode < 200 || res.statusCode >= 300) {
// First reject
reject(new Error('statusCode=' + res.statusCode));
return;
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = JSON.parse(Buffer.concat(body).toString());
} catch(e) {
reject(e);
return;
}
resolve(body);
});
});
req.on('error', function(err) {
// Second reject
reject(err);
});
req.write('test');
}).then(function(data) {
console.log(data);
}).catch(function(err) {
console.log(err);
});
如果我从远程服务器收到错误的 statusCode
,它将调用 第一个拒绝,并在一段时间后 第二次拒绝。如何正确地使它只调用一个拒绝(我认为 第一个拒绝是正确的在这种情况下) ?我认为我需要关闭 res
自己,但没有 close()
方法对 ClientResponse
对象。
UPD: 第二次拒绝很少触发-为什么?