• 【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('执行「这个」,无论前面发生了什么');
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 上面的例子中,在初始化时调用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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    为了更加方便的实现异步,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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    完整代码

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

    参考资料

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

  • 相关阅读:
    C# 串口通信简单示例
    基于or-tools的护士排班问题建模求解
    【Android】画面卡顿优化列表流畅度三之RecyclerView刷新机制notifyItemRangeInserted
    交叉验证太重要了!
    SpringCloudGateway集成SpringDoc CORS问题
    网站数据加密之Hook通用方案
    Kubernetes(k8s)上搭建nacos集群
    使用C语言实现散列表中的冲突处理方法
    算法提升①
    后端跨域支持
  • 原文地址:https://blog.csdn.net/C2681595858/article/details/127732145