Node-API中napi_make_callback如何等待异步JS函数执行完成?
解决Node-API调用异步JS函数无法获取结果的问题
第一步:修复JavaScript端的getKey函数
你的getKey函数存在逻辑错误:await对回调式的request.post无效,因为它不返回Promise,导致函数直接返回未初始化的obj,自然拿不到有效密钥。需要将request.post包装为Promise:
async function getKey() { const endpoint = `https://ip/getKey`; const requestParams = { client_id: clientId, }; // 把回调式请求包装成Promise,让await生效 const body = await new Promise((resolve, reject) => { request.post({ url: endpoint, form: requestParams }, (err, response, body) => { if (err) { console.log('Error in getting key '); reject(err); } else { resolve(body); } }); }); const parsedBody = JSON.parse(body); return { key: parsedBody.key }; }
第二步:在Node-API中处理异步结果
napi_make_callback调用异步函数后,返回的result是Promise对象,而非最终的密钥值。你需要监听Promise的resolve事件,通过回调获取结果(Node-API不能同步阻塞等待异步操作,会破坏事件循环)。
以下是示例C代码片段:
// 假设已通过napi_make_callback拿到Promise对象result napi_value then_fn; // 获取Promise的then方法 napi_get_named_property(env, result, "then", &then_fn); // 定义Promise resolve后的回调函数,用于处理拿到的结果 napi_value promise_resolve_callback(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value resolved_value; napi_get_cb_info(env, info, &argc, &resolved_value, NULL, NULL); // 从resolved_value中提取key napi_value key; napi_get_named_property(env, resolved_value, "key", &key); // 在这里执行拿到key后的后续逻辑,比如保存、调用其他函数等 // ... return NULL; } // 创建回调函数的napi_value napi_value callback; napi_create_function(env, NULL, 0, promise_resolve_callback, NULL, &callback); // 调用Promise的then方法,传入回调 napi_value undefined; napi_get_undefined(env, &undefined); napi_call_function(env, result, then_fn, 1, &callback, &undefined);
如果需要在异步上下文里完成后续逻辑,可结合napi_create_async_work创建异步工作项,确保不阻塞Node.js事件循环。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

