我正在使用Node-API构建一个Node.js插件。
基本上,我的算法将一个 js 阵列作为输入,然后在插件内部对其进行处理并回传它。
要对阵列执行任何逻辑,我需要遍历它。但我不知道怎么做。因为我在他们的档案或示例中没有找到任何与阵列迭代相关的档案。
所以我认为这更多的是在C. 我已经在下面的代码中添加了我尝试过的内容,但没有作业,我已经在下面的代码中注释掉了它。
我还尝试在nodejs 源代码和node-addon-api中找到任何有用的东西,但由于我对此的了解有限,所以我没有。
请指导我如何回圈和访问该阵列中的每个物件。
napi_value avm_simplify(napi_env env, napi_callback_info info) {
  napi_status status;
  napi_value value;
  size_t argc = 1;
  napi_value args[1];
  status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
  STATUS_CHECK
  if (argc < 1) {
    napi_throw_type_error(env, NULL, WRONG_ARGUMENTS_ERROR);
    return NULL;
  }
  bool is_array = 0;
  status = napi_is_array(env, args[0], &is_array);
  STATUS_CHECK
  if (!is_array) {
    napi_throw_type_error(env, NULL, "Argument type should be an array");
    return NULL;
  }
  // args[0] equals to something like
  // [1, 2, 3, 4, 5]
  // which is the user input (js array)
  napi_value array = args[0];
  /*
  // This is what I wan't to do.
  int length = sizeof(array) / sizeof(array[0]);
  for (size_t i = 0; i < length; i  ) {
      napi_value object = array[i];
      // do some logic with object
  }
  */
  return value;
}
我知道这应该更容易使用C  ,但我的模块将来主要是指C库。
提前致谢。
uj5u.com热心网友回复:
我发现https://nodejs.org/api/n-api.html读起来不错
这是我将如何迭代(添加状态检查)
uint32_t length;
status = napi_get_array_length(env, array, &length);
for (uint32_t i = 0; i < length;   i) {
  napi_value ret;
  napi_get_element(env, array, i, &ret);
  int32_t myint;
  napi_get_value_int32(env, ret, &myint);
下面的示例将输入阵列的每个元素乘以 2
// hello.cc using Node-API
#include <node_api.h>
#include <assert.h>
namespace demo {
napi_value Method(napi_env env, napi_callback_info info) {
  napi_status status;
  napi_value value;
  size_t argc = 1;
  napi_value args[1];
  status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
  assert(status == napi_ok);
  if (argc < 1) {
    napi_throw_type_error(env, NULL, "Wrong number of arguments");
    return NULL;
  }
  bool is_array = 0;
  status = napi_is_array(env, args[0], &is_array);
  assert(status == napi_ok);
  if (!is_array) {
    napi_throw_type_error(env, NULL, "Argument type should be an array");
    return NULL;
  }
  // args[0] equals to something like
  // [1, 2, 3, 4, 5]
  // which is the user input (js array)
  napi_value array = args[0];
  if (!array) {
    std::cout<<"array is null"<<std::endl;
    return NULL;
  }
  uint32_t length;
  status = napi_get_array_length(env, array, &length);
  for (uint32_t i = 0; i < length;   i) {
    napi_value ret;
    napi_get_element(env, array, i, &ret);
    int32_t myint;
    napi_get_value_int32(env, ret, &myint);
    napi_value result;
    napi_create_int32(env, myint * 2, &result);
    napi_set_element(env, array, i, result);
  }
  return array;
}
// copy pasted
napi_value init(napi_env env, napi_value exports) {
  napi_status status;
  napi_value fn;
  status = napi_create_function(env, nullptr, 0, Method, nullptr, &fn);
  if (status != napi_ok) return nullptr;
  status = napi_set_named_property(env, exports, "hello", fn);
  if (status != napi_ok) return nullptr;
  return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)
}  // namespace demo

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										
0 评论