当前位置: 首页 > 知识库问答 >
问题:

等待事件(再次)的同步功能

史洛城
2023-03-14

拼命尝试编写https://www.npmjs.com/package/node-firebird#reading-blobs-aasynchronous的同步版本

基本上我需要(a)等两次:

  1. 执行回调函数,以便事件发射器可用
  2. 为结束事件发生

然后返回Buffer。

我的代码(现在是JS/TS混合代码)当前执行2,但不是1:readBlob返回未定义的,然后Buffer.concat(buffers)稍后被调用…:

function readBLOB(callback: any): Buffer {
    return  callback(async (err, _, eventEmitter) => {
        let buffers = []
        if (err)
            throw err

        eventEmitter.on('data', chunk => {
            buffers.push(chunk);
        });
        return await eventEmitter.once('end', function (e) {
            return Buffer.concat(buffers)
        })
    })
}

很抱歉再问一次(是的,我检查了很多其他问题,尝试了很多东西…),但是如何使这项工作(简单…)有效?

(调用回调的函数fetch_blob_asynchttps://github.com/hgourvest/node-firebird/blob/master/lib/index.js#L4261,以防万一...)

共有1个答案

奚曦哲
2023-03-14

这里很少有错误,比如返回回调函数,女巫返回,我猜,un定义或者在回调函数中返回一些没有意义的东西。

而且async/await在这里没有意义,它没有效果async/await仅在希望等待某个promise解决时才有用。但是你的代码中根本没有promise。

您需要的是新的promise

function readBLOB(callback) {
  return new Promise((resolve, reject) => {
    callback((err, _, eventEmitter) => {
      let buffers = [];
      if (err) reject(err);
      eventEmitter.on("data", chunk => {
        buffers.push(chunk);
      });
      eventEmitter.once("end", function(e) {
        resolve(Buffer.concat(buffers));
      });
    });
  });
}

就这么简单。如果发生错误,您可以解析缓冲区并拒绝

现在你可以像这样使用它:

readBLOB(cb).then(data => {
   console.log(data);
})
 类似资料:
  • 问题内容: 我有一个使用一些异步功能的节点应用程序。 在继续进行其余的应用程序流程之前,我该如何等待异步功能完成? 下面有一个简单的示例。 在示例中,要返回的元素“ ”必须为5而不是1。如果应用程序不等待异步功能,则等于1。 谢谢 问题答案: 使用回调机制: 使用异步等待

  • 我正在尝试做一个简单的应用程序,加载数据并对其执行一个操作.所以我的想法是做这个异步。 我有3个数据源,我想异步加载它们。例如data1.xml、data2.xml和data3.xml所有文件加载起来都相当大,所以需要一些时间(这就是为什么我想要异步的原因)。 例如,我创建了一个包含3个文本框的窗口,这些文本框都绑定到一个特定的属性(Text1、Text2、Text3)和一个按钮。当我点击按钮时,

  • 问题内容: 最近,我不得不更正Web应用程序(我没有创建)中的安全性问题。安全问题是,它正在使用非仅限HTTP的cookie。因此,我不得不将session- cookie设置为仅http-,这意味着您无法再从javascript中读取(设置)cookie的值。到目前为止,接缝都很容易。 更深层的问题是,使用的Web应用程序 在一百万个地方 。 因此,为了不必重写“一百万行代码”,我不得不创建一个

  • 问题内容: 我正在尝试使用新的异步功能,希望解决我的问题以后能对其他人有所帮助。这是我的代码正在工作: 问题是,我的while循环运行得太快,脚本每秒向Google API发送太多请求。因此,我想构建一个睡眠函数以延迟请求。因此,我也可以使用此功能来延迟其他请求。如果还有其他方法可以延迟请求,请告诉我。 无论如何,这是我的新代码不起作用。请求的响应在setTimeout中返回给匿名异步函数,但是我

  • 迄今为止,我们所看到的所有解决方案都是为了在忙碌的等待中提供相互排斥。 然而,忙等待并不是资源的最佳分配,因为它始终在持续检查while循环条件时保持CPU繁忙,尽管进程正在等待临界区变为可用。 所有具有繁忙等待的同步机制也受到优先级反转问题的困扰,即每当存在具有较高优先级的进程必须在关键部分之外等待的进程时总会存在自旋锁的可能性,因为机制意图执行较低优先级 在关键部分进行处理。 然而,这些问题需

  • 假设你乘飞机去国外度假。当你到达机场,并且办理完各种登机手续后,你还需要等待机场广播通知你登机,可能要等很多个小时。你可能会在候机室里面找一些事情来打发时间,比如:读书,上网,或者来一杯价格不菲的机场咖啡,不过从根本上来说你就在等待一件事情:机场广播能够登机的时间。给定的飞机班次再之后没有可参考性;当你在再次度假的时候,你可能会等待另一班飞机。 C++标准库模型将这种一次性事件称为期望(futur