之前寫(xiě)過(guò)一個(gè)開(kāi)源項(xiàng)目 RxWX ,將RxJS移植到微信小程序(以下簡(jiǎn)稱(chēng)”小程序“)中。

RxWX項(xiàng)目地址和介紹: http://github.com/yalishizhude/RxWX

關(guān)于RxJS的介紹,讀者可以去看 官方說(shuō)明 或者關(guān)注公眾號(hào)“Web學(xué)習(xí)社”的后續(xù)文章介紹,這篇文章主要講解RxWX的幾個(gè)使用場(chǎng)景。

微信小程序SDK版本:1.7.0

微信開(kāi)發(fā)者工具版本:1.01

演示項(xiàng)目下載地址:

http://github.com/yalishizhude/RxWX/tree/master/example

Get started

按照RxWX說(shuō)明,把Rx.js和RxWX.js文件放入到utils目錄下。

其中Rx.js是可運(yùn)行在小程序中的Rx.js模塊,RxWX.js是利用Rx.js對(duì)小程序API進(jìn)行的封裝,封裝后API函數(shù)將返回Observable對(duì)象,屬性值不變。

使用時(shí)必須引入該文件,比如

import rxwx from '../../utils/RxWX.js'

同步API與異步API

// 原寫(xiě)法
try {
  let result = wx.removeStorageSync('xx')
  console.log(result) 
} catch(e) {
  console.error('小程序API發(fā)現(xiàn)錯(cuò)誤')
}

// 使用RxWX
import rxwx from '../../utils/RxWX.js'

rxwx.removeStorageSync('xx')
  .catch((e) => console.error('RxWX發(fā)現(xiàn)錯(cuò)誤'))
  .subscribe((resp) => console.log(resp))

看上去好像沒(méi)太大區(qū)別。別著急,接著我們來(lái)繼續(xù)看看異步API的調(diào)用~

// 原寫(xiě)法
wx.removeStorage({
  key: 'xx',
  success: function(res) {
    console.log(res)
  },
  error: function(e) {
    console.error('小程序API發(fā)現(xiàn)錯(cuò)誤')
  }
})
// 引用RxWX,rxwx具有wx的所有函數(shù)和值,但是調(diào)用函數(shù)返回的是Observable對(duì)象
import rxwx from '../../utils/RxWX.js'

rxwx.removeStorage({key: 'xx'})
  .catch((e) => console.error('RxWX發(fā)現(xiàn)錯(cuò)誤'))
  .subscribe((resp) => console.log(resp))

在調(diào)用同步時(shí)RxWX沒(méi)有太大優(yōu)勢(shì),但在調(diào)用異步API的時(shí)候以流的方式來(lái)處理結(jié)果和異常,顯然優(yōu)于回調(diào)。

而且代碼內(nèi)容和同步調(diào)用方式相比并無(wú)變化(只修改了函數(shù)名和入?yún)ⅲ?/p>

這種統(tǒng)一的操作方式可以讓開(kāi)發(fā)者更好的關(guān)注業(yè)務(wù)邏輯,而不需要去分辨API到底是異步還是同步,執(zhí)行結(jié)果到底是在回調(diào)中獲取還是返回值獲取。

這種處理方式是不是讓你想起點(diǎn)什么?歡迎留言討論~

嵌套

登錄后獲取用戶(hù)信息。

// 調(diào)用小程序原生API
wx.login({
  success(res) {
    wx.getUserInfo({
      success(res) {
        console.log(res.userInfo)
      },
      fail(e) {
        console.error(e)
      }
    })
  },
  fail(e) {
    console.error(e)
  }
})

// 調(diào)用RxWX
import rxwx from '../../utils/RxWX.js'

rxwx.login()
  .switchMap(() => rxwx.getUserInfo())
  .catch(e => console.error(e))
  .subscribe(res => console.log(res.userInfo))

原生寫(xiě)法很容易墜入回調(diào)地獄,而利用RxWx的代碼直觀易讀。

合并

同時(shí)獲取用戶(hù)信息和系統(tǒng)信息后進(jìn)行操作。

// 調(diào)用小程序API
let getUser =  new Promise((success, fail) => {
  wx.getUserInfo({
    success,
    fail
  })
})
let getSystem =  new Promise((success, fail) => {
  wx.getSystemInfo({
    success,
    fail
  })
})
Promise.all([getUser, getSystem])
.then((resp) => console.log(resp), e => console.error(e))

// 調(diào)用RxWX
import rxwx, {Rx} from '../../utils/RxWX.js'

Rx.Observable.zip(rxwx.getUserInfo(), rxwx.getSystemInfo())
  .catch(e => console.error(e))
  .subscribe(resp => console.log(resp))

在wepy中使用

應(yīng)微信讀者John的要求,特意補(bǔ)充了這一部分示例。

wepy是一個(gè)比較火的小程序框架,采用預(yù)編譯的方式,讓開(kāi)發(fā)者可以用Vuejs風(fēng)格的組件化方式開(kāi)發(fā)小程序,同時(shí)還支持Node.js模塊。

官網(wǎng)地址: http://tencent.github.io/wepy/

  1. 安裝RxWX

npm i -S rxjs-wx

當(dāng)然我更推薦你使用yarn

yarn add rxjs-wx

  1. 引入模塊

import rxwx from 'rxjs-wx'

  1. 使用rxwx

wepy版本:1.6.0

wepy new 命令初始化項(xiàng)目之后,我們以app.wpy和index.wpy兩個(gè)文件代碼為例,改成用RxWX實(shí)現(xiàn)。

首先是根組件 src/app.wpy 中的 getUserInfo 函數(shù)。

默認(rèn)代碼用到了wepy封裝的小程序API getUserInfo 和回調(diào)函數(shù)。

如果我們引入RxWX的話不再需要從wepy調(diào)用小程序API了,默認(rèn)引入RxWX模塊,帶有小程序API,Rx屬性下帶有RxJS函數(shù)。

然后修改 src/pages/index.wpy 中的 onLoad 函數(shù)。

我們可以直接采用RxJS的流式寫(xiě)法并使用操作符。

代碼目錄: http://github.com/yalishizhude/RxWX/tree/master/example4wepy