作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
C++ 调用 JS 函数 JsFunc(),将 C 函数 MyCFunc() 作为参数传递。 JsFunc() 调用 MyCFunc() 并将 JS 回调函数作为参数传递。
我如何在 MyCFunc() 中保存 JS 回调函数参数,以便我以后可以在 C++ 中的其他地方调用它?
main.cpp
#include <duktape/src/duktape.h>
#include <cassert>
duk_ret_t MyCFunc(duk_context* ctx) {
assert(duk_is_function(ctx, -1) );
(void) duk_require_function(ctx, -1);
// 1.- How to save the callback function parameter
// so that it can be used later on, say in main()?
return 0; // nothing returned
}
int main() {
duk_context* ctx = duk_create_heap_default();
assert(ctx != nullptr);
if (duk_peval_file(ctx, "../../src/jscallback_forum/test.js") != 0) {
printf("Error: %s\n", duk_safe_to_string(ctx, -1));
exit(1);
}
duk_pop(ctx); /* ignore result */
duk_push_global_object(ctx);
duk_bool_t isSuccess = duk_get_prop_string(ctx, -1 , "JsFunc");
assert(isSuccess != false);
// pass MyCFunc as parameter to JsFunc
duk_push_c_function(ctx, &MyCFunc, 1); // MyCFunc expects Js callback
if (duk_pcall(ctx, 1) != 0) { // JsFunc call failed
printf("Error: %s\n", duk_safe_to_string(ctx, -1));
}
duk_pop(ctx); /* pop duk_pcall result/error */
duk_pop(ctx); /* pop duk_push_global_object */
// 2. How do I retrieve the JS callback function
// saved in MyCFunc() and run it?
duk_destroy_heap(ctx);
return 0;
}
测试.js
function JsFunc(cfunc) {
print("Entering testCFunc" );
cfunc(function () {
print("In lambda function()");
});
print("Exiting testCFunc");
}
最佳答案
原则上与类似的 Ecmascript 函数没有区别:接受回调的 C 函数(在您的示例中为 MyCFunc
)需要在返回之前将参数回调存储到更持久的位置,以便以后可以查找它。
该存储位置有多个选项;等效的 Ecmascript 函数可能会将引用存储到全局对象或全局对象中保存的某些数据结构(例如 callbacks
数组)。从 C 使用 Duktape 时,您还可以使用 Duktape 提供的“隐藏”对象之一(请参阅 http://duktape.org/api.html#duk_push_global_stash ),这对 Ecmascript 代码不可见。
作为一个具体的例子,下面是如何将回调存储到全局对象中,假设一次只存储一个回调:
duk_ret_t MyCFunc(duk_context *ctx) {
/* Value stack index 0 has callback function. */
/* Equivalent to Ecmascript code: globalObject._my_callback = arg; */
duk_dup(ctx, 0);
duk_put_global_string(ctx, "_my_callback");
return 0;
}
然后当你想调用它的时候:
duk_int_t rc;
/* ... */
duk_get_global_string(ctx, "_my_callback");
rc = duk_pcall(ctx, 0); /* no arguments in this example */
if (rc != 0) {
printf("Callback failed: %s\n", duk_safe_to_string(ctx, -1));
} else {
printf("Callback success\n");
}
duk_pop(ctx); /* pop result */
关于javascript - 在 Ductape 中必须保存一个 Js 回调函数,将参数传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890928/
C++ 调用 JS 函数 JsFunc(),将 C 函数 MyCFunc() 作为参数传递。 JsFunc() 调用 MyCFunc() 并将 JS 回调函数作为参数传递。 我如何在 MyCFunc(
我是一名优秀的程序员,十分优秀!