javascript - 如何 promise Node.js 插件方法

标签 javascript node.js v8

我想准备一个发送给 node-java 的拉取请求支持 Promises/A+ 的 NPM 包。该包利用 JNI 使在 Node.js 应用程序中使用来自 Javascript 的 Java 类成为可能。对于每个导入的 java 类,它以同步和异步变体形式公开该类的方法。异步变体使用标准的 node.js 回调函数,这些函数很容易从 javascript 中实现(我已经使用 Q 和 Bluebird 做到了这一点)。但我想增强node-java,以便它可以自动提供 promise 的方法。对于已经使用过 v8 和 node.js 插件的人来说,这可能是一项微不足道的任务,但我对这两者都是新手。我希望这里有人可以帮我节省至少几天的学习时间。

我需要修改的关键代码位于 src/javaObject.cpp看起来像这样(我添加了一些不在 github 上的源代码中的注释):

for(std::list<jobject>::iterator it = methods.begin(); it != methods.end(); ++it) {
  jstring methodNameJava = (jstring)env->CallObjectMethod(*it, method_getName);
  assert(!env->ExceptionCheck());
  std::string methodNameStr = javaToString(env, methodNameJava);

  // Create the async method variant, named exactly as the java method is named
  v8::Handle<v8::String> methodName = NanNew<v8::String>(methodNameStr.c_str());
  v8::Local<v8::FunctionTemplate> methodCallTemplate = NanNew<v8::FunctionTemplate>(methodCall, methodName);
  funcTemplate->PrototypeTemplate()->Set(methodName, methodCallTemplate->GetFunction());

  // Create the sync method variant, with 'Sync' appended to the method name
  v8::Handle<v8::String> methodNameSync = NanNew<v8::String>((methodNameStr + "Sync").c_str());
  v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = NanNew<v8::FunctionTemplate>(methodCallSync, methodName);
  funcTemplate->PrototypeTemplate()->Set(methodNameSync, methodCallSyncTemplate->GetFunction());
}

我想在初始化时将 promisify 函数(用 javascript 编写)传递给 node-java,大致如下:

var java = require('java');
var asyncOptions = {
  promisify: require('q').nfbind     // or require('bluebird').promisify
  suffix: 'Promise'
};
java.setAsyncOptions(asyncOptions);

我需要知道如何实现新方法 setAsyncOptions(asyncOptions);

然后,在上面的循环中,我将添加以下代码:

// Create the promise method variant, appending to the original method name the passed in suffix.
v8::Handle<v8::String> promiseSuffixStr = ???; // asyncOptions.suffix
v8::Handle<v8::String> methodNamePromise = NanNew<v8::String>(methodNameStr + promiseSuffixStr);
v8::Local<v8::FunctionTemplate> methodCallTemplate = NanNew<v8::FunctionTemplate>(methodCall, methodName);
v8::Local<v8::FunctionTemplate> promiseCallTemplate = ???; // asyncOptions.promisify(methodCallTemplate)
funcTemplate->PrototypeTemplate()->Set(methodNamePromise, promiseCallTemplate->GetFunction());

我需要有关 ??? 所示的两个部分的帮助。

预先感谢您的帮助。

<小时/>

编辑:我在这方面取得了良好进展,并提交了 PR 草案。 node-java 的所有者已同意与我合作完成它。欢迎阅读本文的任何人查看the PR 。当我们有了完整的解决方案时,我会用答案更新这个问题。

最佳答案

我找到了完整的解决方案,它现在已合并到 node-java npm 包中。请参阅PR187 .

关于javascript - 如何 promise Node.js 插件方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27789905/

相关文章:

javascript - Rails 解析 Ransack 参数并提交

node.js - 运行nodejs文件时出现警告消息

javascript - 检测聊天窗口中的链接点击事件

javascript - jquery javascript 该函数未调用

node.js - 使用一个 Mongoose 查询的结果进行另一查询

node.js - 如何获得另一个依赖项的依赖项?

javascript - Node.js 0.12 中提供的 ECMAScript 6 功能

javascript - 如何使用 C++ 插件中内置的 node.js 模块

logging - 使用 Google Apps Script V8 与 Rhino 时 "Logs"非常慢?

javascript - JSON api时间戳+数据解析