Microtask queue is not flushed when promises are fulfilled in C++
Reproduction:
#include <node.h> #include <uv.h> #include <unistd.h> static v8::Persistent<v8::Promise::Resolver> persistent; void run(uv_work_t* req) { sleep(1); } void callback(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)); } void test(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()); } void init(v8::Local<v8::Object> exports) { NODE_SET_METHOD(exports, "test", test); } NODE_MODULE(addon, init)
var r = 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.