我正在使用highland.js
流读取两个定界符之间的内容来处理文件。我还async.js
习惯于按顺序运行一系列http请求。
理想情况下,我想将x
高地的输出作为第一个函数传递给async
序列(链),以便对从流中提取的每个块执行HTTP请求。
这可能吗?如果是这样,如何实现?
var async = require('async');
var _ = require('highland');
_(fs.createReadStream(files[0], { encoding: 'utf8' }))
.splitBy('-----BEGIN-----\n')
.splitBy('\n-----END-----\n')
.filter(chunk => chunk !== '')
.each(function (x) {
}).done(function () {
async.series([
function(callback) {
setTimeout(function() {
console.log('Task 1');
callback(null, 1);
}, 300);
},
function(callback) {
setTimeout(function() {
console.log('Task 2');
callback(null, 2);
}, 200);
},
], function(error, results) {
console.log(results);
});
});;
你可以摆脱调用的each
和done
。过滤后,您可以通过进行后续操作.toArray(callback)
。回调传递给包含高地结果的数组。您可能会像这样重构
var Q = require('q');
var _ = require('highland');
_(fs.createReadStream(files[0], { encoding: 'utf8' }))
.splitBy('-----BEGIN-----\n')
.splitBy('\n-----END-----\n')
.filter(chunk => chunk !== '')
.each(asyncTasks);
function asyncTasks(x) { // here, x will be each of the results from highland
async.series([
// do something with x results
function(callback) {
console.log('Task 1');
callback(null, 1);
},
// do something else with x results
function(callback) {
console.log('Task 2');
callback(null, 2);
},
], function(error, results) {
console.log(results);
});
}
这是指向的文档的链接toArray
。toArray
消耗流,done
也是如此。如果您有任何疑问,请告诉我。
坦白地说,我认为使用Promise会更好。尽管其中一部分只是个人喜好,部分是因为它使代码更具可读性。根据我的阅读,异步比承诺更有效,但是关于承诺的好处在于,您可以将结果从一个函数传递给下一个函数。因此,在您的示例中,您可以x
在第一部分中做一些事情,然后将修改后的结果传递给下一个函数,下一个函数,依此类推。在使用的地方async.series
,通过调用完成每个函数,callback(null, result)
直到从本系列的所有调用中获得所有结果时,您要在该系列的最后完成时,才能获得结果。callback
。现在,您始终可以将结果保存到async.series之外的某个变量中,但这会使您的代码更加混乱。如果您想用Promise重写它,它将如下所示。我在q
这里使用,但这只是您可以使用的许多Promise库之一。
var async = require('async');
var _ = require('highland');
_(fs.createReadStream(files[0], { encoding: 'utf8' }))
.splitBy('-----BEGIN-----\n')
.splitBy('\n-----END-----\n')
.filter(chunk => chunk !== '')
.each(asyncTasks);
function asyncTasks(x) { // here, x will be an array of the results from highland
return asyncTask1(x)
.then(asyncTask2)
.then(asyncTask3)
}
function asyncTask1(x) {
var deferred = Q.defer();
// do some stuff
if (// some error condition) {
deferred.reject();
} else {
deferred.resolve(x); // or pass along some modified version of x
}
return deferred.promise;
}
function asyncTask2(x) {
// same structure as above
}
function asyncTask3(x) {
// same structure as above
}
如今,一些异步API已经开始返回promise,除了接受回调或有时代替回调。因此,对它感到满意是一件好事。承诺超级有用。您可以在这里和这里阅读有关它们的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句