首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进node.js加载项方法

如何改进node.js加载项方法
EN

Stack Overflow用户
提问于 2015-01-05 23:50:40
回答 1查看 544关注 0票数 1

我想准备一份对节点-java NPM一揽子计划的请求,以支持承诺/A+。这个包利用JNI使在node.js应用程序中使用Javascript中的Java类成为可能。对于每个导入的java类,它都在同步和异步变体中公开该类的方法。异步变体使用标准的node.js回调函数,这些函数很容易从javascript中进行编程(我使用了Q和Bluebird)。但是我想增强node,以便它能够自动提供改进的方法。对于已经使用过v8和node.js插件的人来说,这可能是一项琐碎的任务,但我对两者都是新手。我希望这里的人能拯救我,至少几天的学习曲线。

我需要修改的关键代码是src/javaObject.cpp,如下所示(我在github的源代码中添加了一些注释):

代码语言:javascript
复制
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编写)传递给节点-java,如下所示:

代码语言:javascript
复制
var java = require('java');
var asyncOptions = {
  promisify: require('q').nfbind     // or require('bluebird').promisify
  suffix: 'Promise'
};
java.setAsyncOptions(asyncOptions);

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

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

代码语言:javascript
复制
// 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());

我需要两部分的帮助。

提前感谢您的帮助。

编辑:我已经在这方面取得了很好的进展,并提交了一份公关草案。node-java的所有者已经同意和我一起完成它。任何阅读这篇文章的人都可以看看公关。当我们有一个完整的解决方案时,我将用答案更新这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 05:17:06

我找到了完整的解决方案,它现在被合并到节点-java npm包中。见PR187

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27789905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档