JS API: JavaScript Application Programming Interface, JavaScript應用程式程式設計接口。
OpenHarmony上JS API實作方式有三種,分别是:JSI機制、Channel機制、NAPI機制。
JSI機制:L0~L1裝置支援。
Channel機制:L3裝置支援。
NAPI機制:目前僅L2裝置支援,後續須推廣到L3~L5裝置。
一句話概括NAPI,就是L2裝置上的 JS API實作方式。
優先封裝異步方法!同步方法可待社群回報需要時再行添加。
若引擎開啟<code>Promise</code>特性支援,則異步方法必須同時支援<code>Callback</code>方式和<code>Promise</code>方式。使用哪種方式由應用開發者決定,以是否傳遞<code>Callback</code>進行區分。不傳遞<code>Callback</code>即為<code>Promise</code>方式,方法執行結果為<code>Promise</code>執行個體對象。
<code>L0</code>到<code>L1</code>裝置上受限于硬體水準,隻實作<code>Callback</code>方式的異步方法;
<code>L2</code>到<code>L5</code>裝置上,必須實作同時支援<code>Callback</code>方式和<code>Promise</code>方式的異步方法。
Promise 異步模型是 OHOS 标準異步模型之一。
Promise對象: ES6原生提供了Promise對象,Promise是異步程式設計的一種解決方案,可以替代傳統的解決方案--回調函數和事件。promise對象是一個異步操作的結果,提供了一些API使得異步執行可以按照同步的流表示出來,避免了層層嵌套的回調函數,保證了回調是以異步的方式進行調用的。使用者在調用這些接口的時候,接口實作将異步執行任務,同時傳回一個 Promise 對象,其代表異步操作的結果。在傳回的結果的個數超過一個時,其以對象屬性的形式傳回。
Promise特點 作為對象,Promise有兩個特點:(1)對象的狀态不受外界影響;(2)一旦狀态改變了就不會再變,也就是說任何時候Promise都隻有一種狀态。
Callback 異步模型是 OHOS 标準異步模型之一。使用者在調用這些接口的時候,接口實作将異步執行任務。任務執行結果以參數的形式提供給使用者注冊的回調函數。這些參數的第一個是 Error 或 undefined 類型,分别表示執行出錯與正常。
API集合按業務功能進行子產品劃分。開發者使用前須import對應的子產品。
命名:<code>@ohos.子產品名</code>
注意:
子產品名須唯一,由<code>ACE</code>團隊統一維護,子系統新增子產品時須向<code>ACE</code>團隊申請。
子產品名最好是單個名詞。實在不行,也可以由多個名詞組成,但必須遵循<code>小駝峰</code>命名規則。
一個子產品,一個聲明檔案(<code>*.d.ts</code>)。聲明檔案命名遵循<code>@ohos.子產品名.d.ts</code>,檔案名全小寫,單詞間無分割。
N-API通過注冊函數進行子產品的注冊,其接受一個全局變量參數,全局變量結構體中定義了子產品名及子產品初始化函數。在子產品的初始化中,我們可以定義子產品需要暴露的方法及屬性。
示例:
```C++
static napi_value StorageExport(napi_env env, napi_value exports)
{
const char* storageClassName = "Storage";
napi_value storageClass = nullptr;
/ 定義子產品需要對外暴露的方法 /
static napi_property_descriptor storageDesc[] = {
DECLARE_NAPI_FUNCTION("get", JSStorageGet),
DECLARE_NAPI_FUNCTION("getSync", JSStorageGetSync),
};
/ 定義C++類對應的JavaScript類,包括JS類名、JS構造函數 /
napi_define_class(env, storageClassName, strlen(storageClassName), JSStorageConstructor, nullptr,
sizeof(storageDesc) / sizeof(storageDesc[0]), storageDesc, &storageClass);
/ 定義子產品需要對外暴露的屬性 /
static napi_property_descriptor desc[] = {
DECLARE_NAPI_PROPERTY("Storage", storageClass),
/ 設定exports對象屬性 /
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
static napi_module storageModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = StorageExport,
.nm_modname = "storage",
.nm_priv = ((void*)0),
.reserved = { 0 },
聲明檔案模闆
<code>@ohos.子產品名.d.ts</code>檔案:
聲明檔案<code>@ohos.storage.d.ts</code>
JS API 調用流程如下圖所示:
接口定義
```c++
/入參
napi_env:表示一個上下文的變量;
napi_callback_info:傳遞給回調函數的一個封裝的資料類型,可以用于擷取有關調用時的上下文資訊,也可以用于設定回調函數的傳回值;
傳回值
napi_value:對所有js的基本值的一個密閉封裝,就是表示一個基本值;
*/
static napi_value Get(napi_env env, napi_callback_info info);
static napi_value GetSync(napi_env env, napi_callback_info info);
示例
聲明
實作
static napi_value GetSync(napi_env env, napi_callback_info info)
size_t requireArgc = 1;
size_t argc = 2; //參數個數
napi_value argv[2] = { 0 }; //參數定義
napi_value thisVar = nullptr; //JS對象的this參數
void* data = nullptr; //回調資料指針
異步回調流程如下圖所示:
static napi_value Get(napi_env env, napi_callback_info info)
size_t argc = 3; //參數個數
napi_value argv[3] = { 0 }; //參數定義
作者:趙軍霞
更多原創内容請關注:開鴻 HarmonyOS 學院
入門到精通、技巧到案例,系統化分享HarmonyOS開發技術,歡迎投稿和訂閱,讓我們一起攜手前行共建鴻蒙生态。
想了解更多關于鴻蒙的内容,請通路:
51CTO和華為官方戰略合作共建的鴻蒙技術社群
https://harmonyos.51cto.com/#bkwz