You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:06:18