当前位置: 首页 > 面试题库 >

避免多流回调地狱

南宫阳焱
2023-03-14
问题内容

当我打开多个流并且必须获得一个绝对end事件来完成逻辑时,如何避免使用类似递归的结构。

var someArray = ['file1', 'file2', 'file3'];

someArray.forEach(function( file ) {
    fs
        .createReadStream( file )
        .pipe( /* do some stuff */ )
        .on('data', function( usageInfo ) {

            // done?

        });
}

我有几个文件必须通过tp进行一些处理。如何设置一个事件,告诉我所有这些事件何时完成?目前,我得到的是每个end事件都是单独的。

我绝对可以同时开始每个视频流。我只需要以某种方式收集结局?

我可以为每个end事件调用一个函数调用并对其进行计数……虽然听起来很hacky?

我觉得有办法兑现诺言,但我不知道怎么做。


问题答案:

我觉得有办法兑现诺言,但我不知道怎么做。

就在这里。由于promise确实表示异步值,因此您将在一个流的结尾得到一个promise:

var p = new Promise(function(resolve, reject) {
    fs.createReadStream(file)
    .on('error', reject)
    .pipe(/* do some stuff */)
    .on('end', resolve)
    .on('error', reject); // call reject(err) when something goes wrong
});

它可以像使用p.then(functio(usageInfo) { console.log("stream ended"); })

现在,如果您创建多个promise,其中一个用于数组中的文件名,则所有流将并行运行,并在完成时解析各自的promise。然后,您可以Promise.all用来收集-读取“
await”-将它们各自的所有结果转换成一系列结果的新承诺。

var promises = ['file1', 'file2', 'file3'].map(function(file) {
    return new Promise(function(resolve, reject) {
        …
    });
});
Promise.all(promises).then(function(usageInfos) {
    console.log("all of them done", usageInfos),
}, function(err) {
    console.error("(At least) one of them failed", err);
});


 类似资料:
  • 本文向大家介绍如何避免回调地狱?相关面试题,主要包含被问及如何避免回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 你可以有以下方式避免回调地狱 模块化:将回调函数转换为独立的函数 使用流程控制库,例如[aync] 使用Promise 使用aync/await 使用来计算生成器或Promise 解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。  

  • 按ID找到一个有评论和链接属于它的帖子: 如何使用Promise(http://mongoosejs.com/docs/promissies.html)避免回拨地狱? 好像不好......

  • 问题内容: 我正在使用以下代码通过AJAX提交表单: 背景 我的PHP处理程序执行各种任务,然后发回响应。然后,我可以在成功或错误函数中执行某些操作。 我的问题 当用户双击表单的“提交”按钮时,将发生两次AJAX调用,这将导致我的PHP处理程序中的代码执行两次。 我的问题 如果用户双击提交,如何避免我的代码执行两次? 问题答案: 当AJAX调用再次出现时,请先禁用首次单击的“提交”按钮,然后重新启

  • 此问题是之前问题的后续:使用Streams添加BigDecimals 这个问题与使用Java8和Lambda表达式添加有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,方法都会抛出一个。 考虑下面的代码: 香草Java代码对空集合没有问题,但是新的Java8代码有问题。 在这里避免NSEE最优雅的方式是什么?当然,我们可以做到: 但是有没有一种Java的方法来处理空集合?

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文