【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
创建一个异步任务,该接口接收两个回调函数分别是execute
和complete
,execute
在执行器准备好之后被调用,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