Created
September 8, 2017 03:35
-
-
Save swcho/0d154b02a48053da33bb8291510cef78 to your computer and use it in GitHub Desktop.
Nan Simple Callback Helper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typedef void (*callback_helper_cb)(void* self, v8::Isolate* isolate, const v8::Persistent<v8::Function>& callback); | |
struct callback_helper_data { | |
v8::Persistent<v8::Function> callback; | |
void* self; | |
callback_helper_cb cb; | |
}; | |
#define CALLBACK_HELPER_CALL(A, B) v8::Local<v8::Function>::New(isolate, callback)->Call(isolate->GetCurrentContext()->Global(), A, B) | |
uv_async_t* callback_helper(v8::Isolate* isolate, const v8::Local<v8::Function>& func, void* self, callback_helper_cb cb = NULL) { | |
uv_async_t* async = new uv_async_t(); | |
callback_helper_data* data = new callback_helper_data(); | |
data->callback.Reset(isolate, func); | |
data->self = self; | |
data->cb = cb; | |
async->data = data; | |
uv_async_init(uv_default_loop(), async, [](uv_async_t* handle){ | |
LOG("event loop callback"); | |
auto isolate = v8::Isolate::GetCurrent(); | |
v8::HandleScope handleScope(isolate); | |
callback_helper_data* data = (callback_helper_data*)handle->data; | |
if (data->cb != NULL) { | |
data->cb(data->self, isolate, data->callback); | |
} else { | |
v8::Local<v8::Function>::New(isolate, data->callback)->Call(isolate->GetCurrentContext()->Global(), 0, 0); | |
} | |
data->callback.Reset(); | |
delete data; | |
delete handle; | |
}); | |
return async; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
NAN_METHOD(MyClient::Open) { | |
v8::Isolate* isolate = info.GetIsolate(); | |
auto self = SELF(MyClient); | |
auto nodeFunc = info[0].As<v8::Function>(); | |
auto async = callback_helper(isolate, nodeFunc, self, [](void* s, v8::Isolate* isolate, const v8::Persistent<v8::Function>& callback) { | |
MyClient* self = (MyClient*)s; | |
const char* state = self->client->getStateAsString(); | |
v8::Handle<v8::Value> argv[] = { STR(state) }; | |
// v8::Local<v8::Function>::New(isolate, callback)->Call(isolate->GetCurrentContext()->Global(), 0, 0); | |
CALLBACK_HELPER_CALL(1, argv); | |
}); | |
self->client->open([async](ClientResult result) { | |
LOG("Client open"); | |
uv_async_send(async); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment