void handle(PromiseRejectMessage message) {
auto promise = message.GetPromise();
auto event = message.GetEvent();
auto value = message.GetValue();
Isolate* isolate = promise->GetIsolate();
Local<Context> context = isolate->GetCurrentContext();
Local<String> quickApp =
String::NewFromUtf8(isolate, "QuickApp", NewStringType::kNormal)
.ToLocalChecked();
Local<String> p =
String::NewFromUtf8(isolate, "unhandledrejection", NewStringType::kNormal)
.ToLocalChecked();
v8::Local<v8::Object> global =
context->Global()->GetPrototype().As<v8::Object>();
v8::Local<v8::Value> quickAppGlobalMaybe;
(void)global->Get(context, quickApp).ToLocal(&quickAppGlobalMaybe);
if (quickAppGlobalMaybe.IsEmpty() || !quickAppGlobalMaybe->IsObject()) {
return;
}
Local<v8::Object> quickAppGlobal = quickAppGlobalMaybe.As<Object>();
v8::Local<v8::Value> rejectFunc;
(void)quickAppGlobal->Get(context, p).ToLocal(&rejectFunc);
if (rejectFunc->IsFunction()) {
Local<Function> f = rejectFunc.As<Function>();
Local<Value> type = Number::New(isolate, event);
Local<Value> args[] = {type, promise, value};
if(value.IsEmpty()){
value = v8::Undefined(isolate);
}
v8::TryCatch try_catch(isolate);
(void)f->Call(context, Undefined(isolate), 3, args);
if (try_catch.HasCaught() && !try_catch.HasTerminated()) {
fprintf(stderr, "Exception in PromiseRejectCallback:\n");
}
}
}