> 文档中心 > 【OpenHarmony】napi基本用法之promise实现

【OpenHarmony】napi基本用法之promise实现

本文在【OpenHarmony】napi基本用法----HelloWorld的基础上展开。

什么是promise

  • promise是javascript语言中的一个对象,其可以表示一个异步操作的成功或者失败。
  • promise的优势是链式调用,在过去,要想做多重的异步操作,会导致经典的回调地狱。有了promise的链式调用,就可以把回调绑定到返回的 Promise 上,形成一个 Promise 链。
new Promise((resolve, reject) => {    console.log('初始化');    resolve();}).then(() => {    throw new Error('有哪里不对了');    console.log('执行「这个」”');}).catch(() => {    console.log('执行「那个」');}).then(() => {    console.log('执行「这个」,无论前面发生了什么');});
  • 上面的例子中,在初始化时调用resolve()就是假定执行结果是成功。然后就会执行第一个then,里面抛出异常有哪里不对了,然后这个异常就会被后面的catch捕获,打印执行「那个」,接着执行最后面的then,打印执行「这个」,无论前面发生了什么

如何使用napi实现promise

可以分为三步执行:

  • 首先通过接口napi_create_promise创建一个promise对象和一个deferred对象。
  • 然后将deferred对象传递给异步函数完成异步动作。
  • 而promise对象直接返回到js层。
  • 代码(不可执行)如下:
// Create the promise.status = napi_create_promise(env, &myPromise->deferred, &promise);if (status != napi_ok) {    cout << "create promise failed\n";    return NULL;}// Create resource name.napi_value resource = nullptr;status = napi_create_string_utf8(env, "hiPromise", NAPI_AUTO_LENGTH, &resource);if (status != napi_ok) {    cout << "create resource name failed\n";    return nullptr;}// Create async work.status = napi_create_async_work(myPromise->deferred);// Return the promise to JSreturn promise;

为了更加方便的实现异步,napi也提供了相关异步接口:

  • 可以使用napi_create_async_work创建一个异步任务,该接口接收两个回调函数分别是executecompleteexecute在执行器准备好之后被调用,complete在任务执行完成之后被调用。
  • 我们在execute方法里面尽可能不要去调用napi相关接口,因为这个有可能导致它执行javascript对象或者跟js对象的交互。而需要调用napi的操作我们尽可能在complete里面去完成。也就是说我们尽量避免在execute方法里面使用napi_env参数,以避免其和js交互。
  • 伪代码(不可执行)如下:
// Create async work.status = napi_create_async_work(    env, nullptr, resource, Execute, Complete, reinterpret_cast<void *>(myPromise), &myPromise->async_work);if (status != napi_ok) {    cout << "create async work failed\n";    return nullptr;}status = napi_queue_async_work(env, myPromise->async_work);if (status != napi_ok) {    cout << "queue async work failed\n";    return nullptr;}

完整代码

  • 完整代码链接:
    MyPromise
  • 编译方法:
    • language-study/napi/promise目录下执行node-gyp configure build,编译c++代码。
    • 执行js代码node mypromise.js,可以看到如下打印,并停住,按ctrl+c终止程序:
Execute recv falseExecute recv trueparam true thenparam false catch
  • 编译不过请参考【OpenHarmony】napi基础知识学习查看所需要的工具链是否全部安装。

参考资料

mozilla上对Promise用法的介绍
在线运行js代码
napi官方文档介绍promise

驱动天空下载