request
すでに空の配列をマップするために渡すときに、nodejsストリームを動作させるのに問題があります。
var _ = require('highland'),
fs = require('fs'),
request = require('request');
// This works but not using the stream approach
// function get(path) {
// return _(function (push, next) {
// request(path, function (error, response, body) {
// // The response itself also contains the body
// push(error, response);
// push(null, _.nil);
// });
// });
// }
var google = _(request.get('http://www.google.com'));
google
// res is empty array
.map(function (res) {
// console.log(res);
return res;
})
// res is empty array
.toArray(function (res) {
console.log(res);
});
request()モジュールは、一種の古いスタイルのストリームを使用します。コードStreamモジュールからストリームプロトタイプの.pipe()メソッドを呼び出します。
stream.Stream.prototype.pipe.call(this, dest, opts)
https://github.com/mikeal/request/blob/11224dd1f02e311afcc11df8a8f0be1d9fb2bf83/request.js#L1310
実際の問題は、ノードのコアストリームモジュールの次のチェックまで追跡しました。
function ondata(chunk) {
if (dest.writable) {
if (false === dest.write(chunk) && source.pause) {
source.pause();
}
}
}
https://github.com/joyent/node/blob/master/lib/stream.js#L50
上記の例で次の手順を実行することで、パッチを適用できます。
var google = _(request.get('http://www.google.com'));
google.writable = true;
https://github.com/caolan/highland/pull/42でこれを適切に修正するためにプルリクエストを発行しました。これはマージされたため、バージョン1.14.0以降バグは再現できなくなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加