Meteor - 使用 Meteor.wrapAsync() 包装 NPM

2024-05-09

我正在尝试使用 Meteor.wrapAsync 包装超级代理 NPM,一切正常,直到下面代码的最后一行,这导致我的流星应用程序崩溃。

var superagent = Meteor.npmRequire('superagent');

// Example of how superagent works
superagent.get('http://127.0.0.1:8080/json/', function(result){
    console.log(result); // Works, shows the result
});

// This appears to work too
var agentAsync = Meteor.wrapAsync(superagent.get);

// This crashes app
agentAsync('http://127.0.0.1:8080/json/');

我还尝试将上下文传递给wrapAsync(),这没有什么区别:

var agentAsync = Meteor.wrapAsync(superagent.get, superagent);

这是控制台输出:

W20141124-17:31:32.094(0)? (STDERR)           
W20141124-17:31:32.136(0)? (STDERR) /home/ciwolsey/.meteor/packages/meteor-tool/.1.0.35.1bjny7b++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/lib/node_modules/fibers/future.js:206
W20141124-17:31:32.136(0)? (STDERR)                         throw(ex);
W20141124-17:31:32.137(0)? (STDERR)                               ^
W20141124-17:31:32.137(0)? (STDERR) [object Object]
W20141124-17:31:32.137(0)? (STDERR)     at Object.Future.wait (/home/ciwolsey/.meteor/packages/meteor-tool/.1.0.35.1bjny7b++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/lib/node_modules/fibers/future.js:326:15)
W20141124-17:31:32.137(0)? (STDERR)     at packages/meteor/helpers.js:118
W20141124-17:31:32.137(0)? (STDERR)     at app/server/main.js:5:1
W20141124-17:31:32.137(0)? (STDERR)     at app/server/main.js:8:3
W20141124-17:31:32.137(0)? (STDERR)     at /home/ciwolsey/projects/hello/.meteor/local/build/programs/server/boot.js:168:10
W20141124-17:31:32.138(0)? (STDERR)     at Array.forEach (native)
W20141124-17:31:32.138(0)? (STDERR)     at Function._.each._.forEach (/home/ciwolsey/.meteor/packages/meteor-tool/.1.0.35.1bjny7b++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/lib/node_modules/underscore/underscore.js:79:11)
W20141124-17:31:32.138(0)? (STDERR)     at /home/ciwolsey/projects/hello/.meteor/local/build/programs/server/boot.js:82:5
=> Exited with code: 8

这是来源Meteor.wrapAsync https://github.com/meteor/meteor/blob/50e6d3143db8fc6e1fc3fb74da74b40c8dc7f3a4/packages/meteor/helpers.js#L90和来源superget.get https://github.com/visionmedia/superagent/blob/b36fd692139cf366486d45783ede45a4c90c4764/lib/client.js#L982

Meteor.wrapAsync基本上是一个薄薄的包装纸Meteor.bindEnviroment https://github.com/meteor/meteor/blob/556c0e28e94b9351cbf0b28e80a71a4e35f1362a/packages/meteor/dynamics_nodejs.js#L84。它提供了一个等待的绑定函数Fiber.

superget.get最终尝试调用传递给它的回调函数Request.prototype.callback https://github.com/visionmedia/superagent/blob/b36fd692139cf366486d45783ede45a4c90c4764/lib/client.js#L814

这里有趣的是Meteor.bindEnvironment采取Fibers.resolver https://github.com/laverdet/node-fibers/blob/master/future.js#L309函数(需要两个论点),并将其包装在一个函数中,该函数接受没有参数.

So when Request.prototype.callback试图看看fn.length看看是否应该用(err, res)或发送错误emit...它执行后者..

为了使其工作,我们需要短路Request.prototype.callback并让它认为没有参数的函数可以调用为fn(err, res)

superget.Request.prototype.callback = function(err, res){
  var fn = this._callback;
  if (2 == fn.length || 0 == fn.length) return fn(err, res);
  if (err) return this.emit('error', err);
  fn(res);
};

或者,您可以编写自己的Meteor.wrapAsync它提供了具有正确函数长度的回调。例如:

function wrapAsync(fn, context) {
  //XXX Shortened version of wrapAsync. Only works on server, doesn't allow for callback to be passed.
  return function (/* arguments */) {
    var self = context || this;
    var newArgs = _.toArray(arguments);
    var fut = new Future();
    var callback = Meteor.bindEnvironment(fut.resolver());
    newArgs.push(function(err, res){
      return callback.apply(this, arguments);
    });
    fn.apply(self, newArgs);
    return fut.wait()
  };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Meteor - 使用 Meteor.wrapAsync() 包装 NPM 的相关文章

随机推荐

  • 使用 OpenMP 编译会导致内存泄漏

    根据 valgrind 的说法 使用 OpenMP 编译简单的 hello world 程序时可能会导致内存泄漏 这是没有意义的 因为 hello world 程序并没有有意使用任何 OpenMP 功能 假设下面的程序名为hi c并根据 g
  • 如何使用 Boost 程序选项提取已解析选项的序列?

    我正在使用 Boost Graph 和程序选项构建一个图形生成器 例如 有两种类型的组件 C 和 W 每种都有 1 个源 1 个接收器以及一些用于指定其间拓扑的附加参数 我希望能够按照命令行参数的顺序提供的顺序将它们拼接在一起 例如 bin
  • 访问 SSIS 脚本任务静态构造函数中的可配置值

    我有一个 SSIS 包 其中包含需要第 3 方程序集的脚本任务 由于不允许我将此程序集放置在 SSIS 服务器上的 GAC 中 因此我在运行时在脚本任务的静态构造函数中绑定该程序集 这article https blogs msdn mic
  • 可以混淆/加密 SharedPreferences 文件吗?

    因此 我对混淆应用程序的 SharedPreferences xml 文件很感兴趣 就像 Android LVL 混淆其许可证 cahce 数据一样 这是可以想象的吗 大量的谷歌挖掘几乎没有产生任何可能解决我的问题的结果 我当然不是密码学家
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • WordPress 按标题获取帖子,例如

    我正在尝试为 WordPress 创建一个小型搜索功能 AJAX 调用应该获取标题类似的所有帖子 quote 是否有可能在内部实现这种情况get posts 功能 别误会我的意思 阿贾克斯工作正常 我的functions php 中有aja
  • 如何使用谷歌应用程序脚本开发渐进式网络应用程序

    我使用 google app 脚本开发了一些应用程序 并将它们部署为 Web 应用程序 它们都工作正常 然后我决定将它们转换为 PWA 原因是让它们可以安装在智能手机用户的主屏幕上 能够使用推送通知 缓存等 简而言之 PWA 提供的所有优势
  • Automapper Nuget 包失败

    我尝试安装http automapper org http automapper org 但这导致了错误 Install Package AutoMapper already has a dependency defined for Mic
  • 如何在 Mac 上使用 homebrew 安装 apache-spark 2.3.3

    brew install apache spark只安装最新版本的 Spark 2 4 和 brew search apache spark没有给出任何其他选项 有没有办法用自制程序安装旧版本的 Spark Type brew tap ed
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 当 $.each 和 array.splice(i) 放在一起时,JQuery 处理数组超出索引错误

    最近我在互联网上搜索一些可以处理废弃的 ajax xhr 调用的代码 这就是我发现的 https stackoverflow com a 8841412 395910 xhrPool ajaxSetup beforeSend functio
  • 厚壁二维迷宫中的碰撞检测

    我必须使用 Windows Forms 为学校制作一个游戏 我的游戏包括用户必须穿过迷宫 我试图阻止我的用户使用碰撞检测直接穿过墙壁 但由于用于表示墙壁的矩形形状不同而陷入困境 这是游戏的图像 https i stack imgur com
  • CSS 停止表格行内的分页符

    我试图避免在可能超过一页的 HTML 表的行内出现分页符 我正在使用 Internet Explorer 打印预览以及 BCL EasyPDFSDK 转换为 PDF 来测试这一点 我将以下 CSS 样式以各种组合应用到 td 元素 但对于每
  • Apache Atlas:从 Java 客户端连接时出现 Http 503 服务不可用错误

    我正在从我的 MacOS 运行 atlas docker 映像 管理仪表板工作正常 我可以从仪表板创建 管理实体 但是 当我尝试运行 Atlas 源代码提供的示例 Java 应用程序时 我收到 Http 503 Service Unavai
  • 无法打开本地终端

    我尝试在 Android Studio 中初始化我的终端 但它给了我错误 它说 无法打开本地终端 java io IOException 无法创建 PTY 我的电脑运行的是 Windows 10 如何解决这个问题 当您从 Github 存储
  • Eclipse(STS)+ Maven

    我基本上有两个问题 有没有办法从 Eclipse 调用 Maven 控制台 我可以在哪里写eclipse eclipse 并开始构建 eclipse 项目 哪里有STS http www springsource com products
  • 使用 jquery 自动完成和工具提示[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 How to display the autocomplete and tooltip like th
  • Android Material主题alpha颜色问题

    我已经创建了一个构建版本为 5 0 的应用程序 我在下面编写了主题
  • ruby中如何获取屏幕分辨率

    如何在ruby脚本中获取屏幕分辨率 高度 宽度 在 Linux 上 x y xrandr scan current d x d flatten 在 Windows 上 使用WIN32OLE等 http www ruby forum com
  • Meteor - 使用 Meteor.wrapAsync() 包装 NPM

    我正在尝试使用 Meteor wrapAsync 包装超级代理 NPM 一切正常 直到下面代码的最后一行 这导致我的流星应用程序崩溃 var superagent Meteor npmRequire superagent Example o