本文在【OpenHarmony】napi基本用法----HelloWorld的基础上展开。
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_create_promise
创建一个promise对象和一个deferred对象。// 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 JS
return 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;
}
language-study/napi/promise
目录下执行node-gyp configure build
,编译c++代码。node mypromise.js
,可以看到如下打印,并停住,按ctrl+c终止程序:Execute recv false
Execute recv true
param true then
param false catch
MyPromise
模块实现了一个hiPromise
方法,当传入hiPromise
的参数为true
时,promise
会触发resolve
,传入的参数为false
则会触发reject
。