• callback <void (*)(void*)> 一个退出时调用的函数的指针。
    • args <void*> 一个退出时传递给回调的指针。

    注册的 AtExit 钩子会在事件循环结束之后但虚拟机被终止之前退出。

    AtExit 有两个参数:一个退出时运行的回调函数的指针,和一个要传入回调的无类型的上下文数据的指针。

    回调按照后进先出的顺序运行。

    以下 addon.cc 实现了 AtExit

    1. // addon.cc
    2. #include <assert.h>
    3. #include <stdlib.h>
    4. #include <node.h>
    5. namespace demo {
    6. using node::AtExit;
    7. using v8::HandleScope;
    8. using v8::Isolate;
    9. using v8::Local;
    10. using v8::Object;
    11. static char cookie[] = "yum yum";
    12. static int at_exit_cb1_called = 0;
    13. static int at_exit_cb2_called = 0;
    14. static void at_exit_cb1(void* arg) {
    15. Isolate* isolate = static_cast<Isolate*>(arg);
    16. HandleScope scope(isolate);
    17. Local<Object> obj = Object::New(isolate);
    18. assert(!obj.IsEmpty()); // assert VM is still alive
    19. assert(obj->IsObject());
    20. at_exit_cb1_called++;
    21. }
    22. static void at_exit_cb2(void* arg) {
    23. assert(arg == static_cast<void*>(cookie));
    24. at_exit_cb2_called++;
    25. }
    26. static void sanity_check(void*) {
    27. assert(at_exit_cb1_called == 1);
    28. assert(at_exit_cb2_called == 2);
    29. }
    30. void init(Local<Object> exports) {
    31. AtExit(sanity_check);
    32. AtExit(at_exit_cb2, cookie);
    33. AtExit(at_exit_cb2, cookie);
    34. AtExit(at_exit_cb1, exports->GetIsolate());
    35. }
    36. NODE_MODULE(NODE_GYP_MODULE_NAME, init)
    37. } // namespace demo

    在 JavaScript 中测试:

    1. // test.js
    2. require('./build/Release/addon');