快應(yīng)用 接口概述

2020-08-10 13:44 更新

接口方法有同步、異步、回調(diào)、異步回調(diào)四種類型,不同類型的接口方法,提供的能力也不相同。

同步

同步接口會直接返回調(diào)用結(jié)果,結(jié)果可以是任意類型,參見相關(guān)的接口文檔。

使用示例:

console.log(JSON.stringify(app.getInfo()))

異步

異步接口不會立即返回調(diào)用結(jié)果,在異步接口任務(wù)完成后執(zhí)行某些操作,可選擇以下方式之一:

  • 使用回調(diào)函數(shù)
  • 使用 Promise 1010+

使用回調(diào)函數(shù)

開發(fā)者可以在調(diào)用異步接口的實參中傳遞相應(yīng)的回調(diào)函數(shù);回調(diào)函數(shù)會在接口任務(wù)完成時根據(jù)狀態(tài)執(zhí)行回調(diào)。任意回調(diào)函數(shù)最多執(zhí)行一次

異步接口支持的回調(diào)函數(shù)有:

回調(diào)函數(shù) 參數(shù)名 類型 必填 說明
success data Any 調(diào)用結(jié)果,可以是任意類型,參見接口使用文檔 在調(diào)用成功時回調(diào)
fail data Any 錯誤信息,一般是描述錯誤信息的字符串,也可以是其他類型,參見接口使用文檔 在調(diào)用失敗時回調(diào)
code Number 錯誤代碼,如果文檔未特別說明,會返回200。如果返回其他錯誤代碼,需要在文檔中列舉說明 在調(diào)用失敗時回調(diào)
cancel data Any 調(diào)用結(jié)果,一般無內(nèi)容,參見接口使用文檔 在用戶取消時回調(diào)。部分需要用戶交互的接口調(diào)用中可能提供此回調(diào)支持
complete 在調(diào)用完成時回調(diào)

success、fail和cancel三個回調(diào)函數(shù)是互斥的,每次接口調(diào)用都會且僅會調(diào)用這三個回調(diào)函數(shù)中的一個,之后會再調(diào)用一次complete回調(diào)。

使用示例:

prompt.showContextMenu({
  itemList: ['item1', 'item2'],
  itemColor: '#ff33ff',
  success: function(data) {
    console.log("handling callback");
  },
  fail: function(data, code) {
    console.log("handling fail, code=" + code);
  },
  cancel: function(data) {
    console.log("handling cancel");
  },
  complete: function() {
    console.log("handling complete");
  },
})

使用 Promise

支持調(diào)用異步接口返回 ?Promise? 實例,開發(fā)者可以在返回的 ?Promise? 實例上使用 ?then?, ?catch? 方法綁定回調(diào)函數(shù)

?Promise ?實例的狀態(tài)是 resolve(成功)還是 reject(失?。?/b>,依賴于異步接口任務(wù)執(zhí)行的結(jié)果。若任務(wù)成功,則 ?Promise ?實例的狀態(tài)為 ?resolve?;否則,?Promise?實例的狀態(tài)為 ?reject?

使用方法:

只有在調(diào)用異步接口的實參中不傳遞任何回調(diào)函數(shù)時,才會返回一個 ?Promise ?實例

若在調(diào)用異步接口的實參中,某個屬性(如:success)的值為函數(shù),則調(diào)用異步接口的返回值為 undefined,切換至上面介紹的?使用回調(diào)函數(shù)?模式

因此,在框架中不能同時使用回調(diào)函數(shù)和使用Promise

在 ?Promise ?實例的 ?then ?方法中,可傳入兩個參數(shù):

  • 第一個參數(shù)為 ?resolve?(成功)的回調(diào)函數(shù),對應(yīng)異步接口支持的回調(diào)函數(shù)中的?success ?和 ?callback?。參數(shù)的 data 屬性為返回的數(shù)據(jù)
  • 第二個參數(shù)為 ?reject?(失?。┑幕卣{(diào)函數(shù),對應(yīng)異步接口支持的回調(diào)函數(shù)中的 ?cancel ?或 ?fail?。失敗的回調(diào)函數(shù)的參數(shù)比成功的回調(diào)函數(shù)多一個 code 屬性,用于判斷具體狀態(tài)。若 code 為 100,對應(yīng) cancel;若 code 大于或等于 200,對應(yīng) fail

示例:

const promise = prompt.showContextMenu({
  itemList: ['item1', 'item2'],
  itemColor: '#ff33ff'
})
promise.then(
  res => {
    console.log(`異步接口返回的數(shù)據(jù):${res.data}`)
  },
  res => {
    console.log(`異步接口返回的數(shù)據(jù):${res.data}`)
    console.log(`異步接口返回的狀態(tài)碼:${res.code}`)
    if (res.code === 100) {
      // 對應(yīng)異步接口支持的回調(diào)函數(shù)中的cancel
    } else if (res.code >= 200) {
      // 對應(yīng)異步接口支持的回調(diào)函數(shù)中的fail
    }
  }
)

訂閱

訂閱接口不會立即返回調(diào)用結(jié)果,開發(fā)者需要在實參中傳遞相應(yīng)的回調(diào)函數(shù);回調(diào)函數(shù)會在接口任務(wù)完成時執(zhí)行回調(diào);由于是訂閱類型,回調(diào)函數(shù)可能執(zhí)行多次

訂閱接口支持的回調(diào)函數(shù):

參數(shù)名 類型 說明
callback Function 回調(diào),每次訂閱的對象變化時,都會被執(zhí)行
fail Function 失敗回調(diào),返回錯誤信息和錯誤代碼。若文檔未特別說明,錯誤代碼為 200。若返回其他錯誤代碼,參見具體的接口文檔

以監(jiān)聽地理位置(geolocation.subscribe)為例:

  • 調(diào)用 geolocation.subscribe 監(jiān)聽地理位置的改變,則每次地理位置發(fā)生改變,都會調(diào)用傳入的 callback 回調(diào),返回新的位置信息
  • 若用戶拒絕授予權(quán)限,會調(diào)用 fail 回調(diào)函數(shù)并結(jié)束接口調(diào)用,callback 回調(diào)函數(shù)永遠(yuǎn)不會被調(diào)用

示例:

geolocation.subscribe({
  callback: function(data) {
    console.log(
      `handling success: longitude = ${data.longitude}, latitude = ${
        data.latitude
      }`
    )
  },
  fail: function(data, code) {
    console.log(`handling fail, code = ${code}`)
  }
})

使用接口的注意事項

接口為只讀,不可覆蓋

執(zhí)行回調(diào)函數(shù)時判斷頁面狀態(tài)

由于異步和訂閱接口不會在調(diào)用后立即返回結(jié)果,而是一段時間后執(zhí)行回調(diào)函數(shù)并攜帶返回結(jié)果作為參數(shù);因此,執(zhí)行回調(diào)函數(shù)時,調(diào)用接口的頁面,會屬于以下三種狀態(tài)之一:

  1. 顯示中(用戶正在閱讀的頁面):this.$valid && this.$visible
  2. 已隱藏(加載新頁,導(dǎo)致頁面被隱藏):this.$valid && !this.$visible
  3. 已銷毀(退出當(dāng)前頁面,頁面被銷毀):!this.$valid && !this.$visible

若執(zhí)行回調(diào)函數(shù)時,調(diào)用接口的頁面已隱藏或已銷毀,則存在以下問題:

  • 若頁面已隱藏,在回調(diào)函數(shù)中更新 ViewModel 中的數(shù)據(jù),會驅(qū)動頁面視圖更新,無意義的降低性能;建議在回調(diào)函數(shù)中緩存數(shù)據(jù),當(dāng)頁面再次進(jìn)入顯示狀態(tài)時,再更新 ViewModel 中的數(shù)據(jù)
  • 若頁面已銷毀,頁面中的 ViewModel 也會銷毀,在回調(diào)函數(shù)中更新 ViewModel 中的數(shù)據(jù)可能會引起報錯;建議在回調(diào)函數(shù)中先判斷頁面狀態(tài),若頁面已被銷毀,則直接退出

提示:關(guān)于頁面狀態(tài)$valid$visible,參見 script 腳本

示例:

geolocation.getLocation({
  success: function(data) {
    if (this.$valid && this.$visible) {
      // 頁面仍在顯示中
    } else if (this.$valid && !this.$visible) {
      // 頁面已隱藏
    } else {
      // 頁面已銷毀
    }
  }.bind(this),
  fail: function(data, code) {
    console.log(`handling fail, code = ${code}`)
  }
})

取消無意義的訂閱

訂閱接口的回調(diào)函數(shù)可能會被多次調(diào)用。若頁面已隱藏或已銷毀,仍繼續(xù)訂閱,既會影響框架的響應(yīng)速度,也會造成內(nèi)存泄露。因此,建議在頁面被銷毀后取消訂閱

在頁面銷毀后取消訂閱有以下兩種方式:

  • 方式一:在頁面生命周期 onDestroy 中取消訂閱
  • 方式二:在訂閱接口的回調(diào)函數(shù)中,先判斷頁面狀態(tài),若頁面已被銷毀,取消訂閱

示例:

export default {
  onDestroy() {
    // 方式一:在頁面生命周期onDestroy中取消訂閱
    geolocation.unsubscribe()
  },
  onReady() {
    // 訂閱,監(jiān)聽地理位置
    geolocation.subscribe({
      callback: function(data) {
        // 方式二:在訂閱接口的回調(diào)函數(shù)中,先判斷頁面狀態(tài),若頁面已被銷毀,取消訂閱
        if (!this.$valid) {
          geolocation.unsubscribe()
        }
        console.log(
          `handling success: longitude = ${data.longitude}, latitude = ${
            data.latitude
          }`
        )
      }.bind(this),
      fail: function(data, code) {
        console.log(`handling fail, code = ${code}`)
      }
    })
  }
}

注:若在應(yīng)用生命周期中調(diào)用訂閱接口,只要應(yīng)用仍然在運行,訂閱都是有效的;建議當(dāng)不再需要訂閱時,主動取消訂閱

權(quán)限控制

部分接口因為涉及到安全和隱私問題,增加了權(quán)限控制,調(diào)用時會出現(xiàn)用戶授權(quán)彈窗,待用戶授權(quán)后才能繼續(xù)執(zhí)行。 權(quán)限控制有兩種模式,一種是每次調(diào)用都需要授權(quán),一種是授權(quán)后記住保存狀態(tài),下次調(diào)用不再需要重復(fù)授權(quán)。

常見錯誤代碼

代碼 含義
200 一般性錯誤
201 用戶拒絕
202 參數(shù)非法
203 服務(wù)不可用
204 請求超時


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號