我想准备一份对节点-java NPM一揽子计划的请求,以支持承诺/A+。这个包利用JNI使在node.js应用程序中使用Javascript中的Java类成为可能。对于每个导入的java类,它都在同步和异步变体中公开该类的方法。异步变体使用标准的node.js回调函数,这些函数很容易从javascript中进行编程(我使用了Q和Bluebird)。但是我想增强node,以便它能够自动提供改进的方法。对于已经使用过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编写)传递给节点-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());我需要两部分的帮助。
提前感谢您的帮助。
编辑:我已经在这方面取得了很好的进展,并提交了一份公关草案。node-java的所有者已经同意和我一起完成它。任何阅读这篇文章的人都可以看看公关。当我们有一个完整的解决方案时,我将用答案更新这个问题。
发布于 2015-02-02 05:17:06
我找到了完整的解决方案,它现在被合并到节点-java npm包中。见PR187。
https://stackoverflow.com/questions/27789905
复制相似问题