【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 JS
return 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 false
Execute recv true
param true then
param false catch
  • 编译不过请参考【OpenHarmony】napi基础知识学习查看所需要的工具链是否全部安装。
  • 上述MyPromise模块实现了一个hiPromise方法,当传入hiPromise的参数为true时,promise会触发resolve,传入的参数为false则会触发reject

参考资料

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

猜你喜欢

转载自blog.csdn.net/C2681595858/article/details/127732145
今日推荐