使用异步处理高地流块

用户名

我正在使用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);
    });

});;
海登·布拉克斯顿(Hayden Braxton)

你可以摆脱调用的eachdone过滤后,您可以通过进行后续操作.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);
    });
}

是指向的文档的链接toArraytoArray消耗流,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从承诺创建高地流时如何处理承诺拒绝?

来自分类Dev

使用列表块时,从同步到异步“处理”

来自分类Dev

为什么在其中使用异步块会使我的流取消固定?

来自分类Dev

异步块使异步内部所有流引用?

来自分类Dev

高地的请求流未正确传递

来自分类Dev

高地的请求流未正确转发

来自分类Dev

在高地流中执行节点MySQL查询

来自分类Dev

在块中使用调度异步

来自分类Dev

异步配置在使用块中

来自分类Dev

使用异步node.js函数控制流和错误处理

来自分类Dev

如何处理异步块Java中的异常

来自分类Dev

如何创建使用类型安全动作AsyncCreator来简化Redux中api请求流的处理的通用异步请求史诗

来自分类Dev

使用调度,异步编程使代码块等待

来自分类Dev

在 try 块中使用异步函数

来自分类Dev

使用Ramda处理异步编程

来自分类Dev

将数字流分成较小的块进行处理

来自分类Dev

TPL数据流批处理块重复元素

来自分类Dev

如何将高地流转换为节点可读流?

来自分类Dev

如何将向量处理为异步流?

来自分类Dev

通过请求流和异步处理关闭连接

来自分类Dev

使用异步/等待时流关闭

来自分类Dev

在异步任务仍在使用时处置流

来自分类Dev

ule子处理策略-从同步流中调用异步私有流

来自分类Dev

具有循环以及多个HTTP和异步SQS的Spring Integration块流

来自分类Dev

如何在同步处理响应代码的同时异步处理龙卷风中的流数据?

来自分类Dev

TPL数据流同步处理每个文件,但异步处理文件中的每一行

来自分类Dev

使用Swift处理Objective-C块

来自分类Dev

Javascript:使用catch块,但不处理错误

来自分类Dev

在SQL中使用ORDER BY处理数据块

Related 相关文章

热门标签

归档