将 Promise 与下载模块结合使用

2023-12-04

我用蓝鸟来承诺。

我试图承诺下载模块.

这是我的实现:

Promise  = require('bluebird'),
download = require('download');

var methodNameToPromisify = ["download"];

function EventEmitterPromisifier(originalMethod) {
    // return a function
    return function promisified() {
        var args = [].slice.call(arguments);
        // Needed so that the original method can be called with the correct receiver
        var self = this;
        // which returns a promise
        return new Promise(function(resolve, reject) {
            // We call the originalMethod here because if it throws,
            // it will reject the returned promise with the thrown error
            var emitter = originalMethod.apply(self, args);

            emitter
                .on("response", function(data) {
                    resolve(data);
                })
                .on("data ", function(data) {
                    resolve(data);
                })
                .on("error", function(err) {
                    reject(err);
                })
                .on("close", function() {
                    resolve();
                });
        });
    };
};
download = { download: download };
Promise.promisifyAll(download, {
    filter: function(name) {
        return methodNameToPromisify.indexOf(name) > -1;
    },
    promisifier: EventEmitterPromisifier
});

然后使用它:

return download.downloadAsync(fileURL, copyTo, {});

我的问题是它没有下载所有文件(我有一个发送到此功能的列表),我做错了什么?


发射器确实发射multiple数据事件,每个接收到的数据块都有一个。然而,a仅代表one未来值,在您的情况下,您希望这是完整的响应。

resolve应该只被调用一次,以用传递的值履行承诺,然后解决。进一步的调用将不会产生任何效果 - 这就是为什么您只获得列表的第一部分。

相反,您需要积累所有数据,当流结束时,您可以用所有数据履行承诺。

var Promise  = require('bluebird'),
    download = require('download'),
    Buffer   = require('buffer'); // should be global anyway

exports = {
    downloadAsync: function promisifiedDownload() {
        var args = arguments, self = this;

        return new Promise(function(resolve, reject) {
            // We call the originalMethod here because if it throws,
            // it will reject the returned promise with the thrown error
            var emitter = download.apply(self, args);
            var buffers = [];

            emitter.on("data", function(data) {
                buffers.push(data);
            }).on("error", function(err) {
                reject(err);
            }).on("close", function() {
                resolve(Buffer.concat(buffers));
            });
        });
    };
};

Notice it's quite nonsensical to use promisifyAll when you only want to promisify a single method. I've omitted it for simplicity

您还可以监听传入的response对象,并附加data直接监听它。然后您可以使用end event代替close.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Promise 与下载模块结合使用 的相关文章

随机推荐

  • 使用 meld 作为 diff 工具时查看 git 过滤器输出

    我设置了一些git 过滤器为了在提交某些文件之前对其进行预处理 在我的例子中是 IPython Notebooks 更准确地说 我正在遵循以下说明 https stackoverflow com a 20844506 578770 如果我提
  • 在 pyinstaller 中以窗口模式导出到 EXE 后,Selenium 不起作用

    我正在制作一个需要使用 selenium 的 PyQt4 应用程序 开发时一切正常 但是当我导出到单个文件执行文件 由py安装程序 and 不带控制台 它会产生以下回溯错误 WinError6 The handle is invalid 当
  • JSONModel 返回 nil

    我使用 JSONModel 从 URL 获取 JSON 这是一个非常简单的对象 仅包含 2 个字符串 name 和 url 首先我制作了对象模型 protocol Tutorial end interface Tutorial JSONMo
  • 在 jsFiddle 中有效,但在我的网站中无效

    由于某种原因 我网站上的这个 jQuery 代码可以在 jsFiddle 上运行 但不能在本地运行 代码是一样的 我刚刚复制并粘贴了它 谁能向我解释这是怎么回事 jsFiddle Local 使用Chrome的开发者工具 在控制台中出现错误
  • 导出后未在 Honeycomb 上调用 BOOT_COMPLETED

    我有一个非常奇怪的问题 网站上已有的问题都没有答案或相同的问题 我有一个接收 BOOT COMPLETED 的应用程序 我通过将 android installLocation 设置为internalOnly 确保它可以接收意图 我的 On
  • Unity : this == null 返回 true。怎么会发生这种事呢? [复制]

    这个问题在这里已经有答案了 我一直在统一开发一个项目 我试图用 Invoke string float 调用一个函数 虽然我收到一条错误消息说要检查我的gameobject为空 所以我尝试做 debug log gameObject nul
  • 用于绘制地图的底图/项目的 Pandas 错误

    我运行了下面的 Python 代码 这是一本书上的 绘制地图 可视化海地地震危机数据 的示例 Python 数据分析 第242 246页 该代码应该创建海地的绘图 但我收到如下错误 Traceback most recent call la
  • 如何从 Win32 DLL 或 OCX 中提取 GUID

    我们有一个 NET 应用程序需要检查可能包含 COM 库 DLL 和 OCX 的文件夹 当我们遇到 COM 库时 我们需要完成的一件事是从 COM DLL 或 OCX 中提取 GUID 有没有一种直接的方法可以在 NET 中执行此操作而不使
  • 无法访问存储在我的 App_Data 文件夹中的图像

    我的 ASP NET MVC Web 应用程序中有以下链接 a href App Data uploads 38 png Model Name a 但是当我点击此链接时 出现以下错误 HTTP 错误 404 8 未找到 请求过滤模块被配置为
  • 将数组从 C# COM 对象传递到 JavaScript?

    与此类似如何将 ActiveX 对象中的字符串数组返回到 JScript但在 C 中 我有一个 COM 控件 它将字符串数组传回 javascript 似乎 javascript 无法理解我传回的是什 么 并且 javascript 中的数
  • 拒绝未转义 HTML 字符的正则表达式

    我想限制在特定输入字段中使用未转义的 符号 我无法让正则表达式杀死 的使用 除非后面跟着 amp 或者可能只是限制 的使用 注意空格 我尝试调整答案在这个线程中 但无济于事 谢谢 FWIW 这是我制作的一个正则表达式 以确保文件名字段不包含
  • 是否可以使用 JMX 在一台中央 MBean 服务器中注册或显示来自不同 VM 的 MBean?

    我正在寻找一种解决方案 用于从中央 MBean 服务器中的不同 Java VM 注册 MBean 或整个 MBean 服务器本身 该服务器也应该在单独的 VM 中运行 目标是只有一个中央 MBean 服务器 其中包含整个系统的所有 MBea
  • Angular UI 引导模式

    我正在使用 Angular UI Bootstrap 模式 ui bootstrap dialog 并且我有background true backgroundClick true 但是 当用户单击远离模式时 我不仅想执行关闭功能 还想执行
  • 如何使用.htaccess将图像请求重写为PHP脚本?

    我有一个 PHP 脚本位于http sb1 dev codeanywhere net a70097sb hc onlinestatus image php这需要两个GET变量 ign and style My htaccess文件与以下目录
  • MySQL 和 C:对 `_mysql_init@4'| 的未定义引用

    我正在尝试为 C 编写一个简单的脚本来从 MySQL 数据库获取值 但它抛出此错误 未定义引用 mysql init 4 不知道我是否没有链接到我应该链接的内容 我的C知识有限 我在 Windows 上使用代码块 这是我的代码 includ
  • 使用计划作业 SQL Agent Management Studio 导出到 CSV

    我正在尝试创建一个 SQL 代理作业 该作业每天自动运行以下查询并生成一个 CSV 文件 该文件存储在 C test csv 上 并通过电子邮件发送给人们 我在网上尝试了各种选项 但找不到适合我的查询的选项 它是来自多个数据集的数据 放入单
  • 如何使用父页面 css 为 iframe 页面内容赋予样式?

    如何使用父页面 css 设置 iframe 页面内容的样式 我没有 iframe 页面的访问权限 我做了这个例如 http jsbin com uxobe 如何为我在 iframe 中使用的页面设置不同的 HTML 样式 有没有办法通过 c
  • :before :after 透明背景下网站标题的 HR 值

    遇到了一些难题 下图是站点标题区域并具有背景图像 到 HTML 文档的正文 然后 我将透明背景放入整个容器 基本上是跨浏览器的半透明背景 深棕色 最重要的是 我使用 PNG 24 切片来处理较暗的边缘 我所坚持的部分是利用 before 和
  • 将 Google Fit 数据提取到 Android 应用程序中

    我们如何获取特定用户存储在 google fit cloud 中的数据 我尝试使用 History API 但没有显示任何数据 然后我尝试通过历史 API 输入一些数据 现在我只能通过历史 API 看到这些数据 而不是实际驻留在 fit 中
  • 将 Promise 与下载模块结合使用

    我用蓝鸟来承诺 我试图承诺下载模块 这是我的实现 Promise require bluebird download require download var methodNameToPromisify download function