diff --git a/js_concurrent_module/common/helper/error_helper.h b/js_concurrent_module/common/helper/error_helper.h index f43ca40e571376eb4a8b38326aed90fd33584a35..1fc2a0806f8c81b6bb821969011de467b668e99f 100644 --- a/js_concurrent_module/common/helper/error_helper.h +++ b/js_concurrent_module/common/helper/error_helper.h @@ -34,7 +34,8 @@ public: ErrorHelper() = default; ~ErrorHelper() = default; - static napi_value NewError(napi_env env, int32_t errCode, const char* errMessage = nullptr) + static napi_value NewError(napi_env env, int32_t errCode, const char* errMessage = nullptr, + napi_value result = nullptr) { std::string errTitle = ""; napi_value concurrentError = nullptr; @@ -149,6 +150,24 @@ public: napi_create_error(env, nullptr, msg, &concurrentError); napi_set_named_property(env, concurrentError, "code", code); napi_set_named_property(env, concurrentError, "name", name); + if (errCode == ERR_ASYNCRUNNER_TASK_CANCELED || errCode == 0) { + napi_value data = nullptr; + napi_create_object(env, &data); + napi_value resultValue = nullptr; + napi_value errorValue = msg; + napi_get_undefined(env, &resultValue); + if (result != nullptr) { + napi_value error = NapiHelper::GetNameProperty(env, result, "error"); + if (NapiHelper::IsNotUndefined(env, error)) { + errorValue = error; + } else { + resultValue = result; + } + } + napi_set_named_property(env, data, "result", resultValue); + napi_set_named_property(env, data, "error", errorValue); + napi_set_named_property(env, concurrentError, "data", data); + } return concurrentError; } diff --git a/js_concurrent_module/taskpool/taskpool.cpp b/js_concurrent_module/taskpool/taskpool.cpp index e26372937c927a592276c726e7048389cb9aad44..6bfc93c1ab503690c4f97db49c2faf3350604a67 100644 --- a/js_concurrent_module/taskpool/taskpool.cpp +++ b/js_concurrent_module/taskpool/taskpool.cpp @@ -417,8 +417,8 @@ void TaskPool::HandleTaskResultInner(Task* task) if (task->taskState_ == ExecuteState::CANCELED) { strTrace += ", performResult : IsCanceled"; napiTaskResult = task->IsAsyncRunnerTask() ? - ErrorHelper::NewError(task->env_, ErrorHelper::ERR_ASYNCRUNNER_TASK_CANCELED) : - ErrorHelper::NewError(task->env_, 0, "taskpool:: task has been canceled"); + ErrorHelper::NewError(task->env_, ErrorHelper::ERR_ASYNCRUNNER_TASK_CANCELED, nullptr, napiTaskResult) : + ErrorHelper::NewError(task->env_, 0, "taskpool:: task has been canceled", napiTaskResult); } else if (status != napi_ok) { strTrace += ", performResult : DeserializeFailed"; taskLog += ", DeserializeFailed";