Reproduction:
#include<node.h>
#include<uv.h>
#include<unistd.h>static v8::Persistent<v8::Promise::Resolver> persistent;
voidrun(uv_work_t* req) {
sleep(1);
}
voidcallback(uv_work_t* req, int i) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope scope(isolate);
v8::Local<v8::Promise::Resolver> local = v8::Local<v8::Promise::Resolver>::New(isolate, persistent);
local->Resolve(v8::Undefined(isolate));
}
voidtest(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
if (persistent.IsEmpty()) {
persistent.Reset(isolate, v8::Promise::Resolver::New(isolate));
uv_work_t * req = (uv_work_t*) malloc(sizeof(uv_work_t));
uv_queue_work(uv_default_loop(), req, run, callback);
}
v8::Local<v8::Promise::Resolver> local = v8::Local<v8::Promise::Resolver>::New(isolate, persistent);
args.GetReturnValue().Set(local->GetPromise());
}
voidinit(v8::Local<v8::Object> exports) {
NODE_SET_METHOD(exports, "test", test);
}
NODE_MODULE(addon, init)varr=require('./build/Release/addon.node');r.test().then(function(){console.log('done');});setTimeout(()=>{},5000);done should be printed after 1 seconds, but is printed after 5 seconds instead.
Reproduction:
doneshould be printed after 1 seconds, but is printed after 5 seconds instead.