《微信小程序開發(fā)之異步轉同步》

問題概述

基于小程序request請求是異步的特性檐春,app.js onLaunch()中的請求與index.js onLoad()中的請求是同時進行的,導致onLoad()中如果有基于onLaunch()返回的數據的請求苗膝,會有報錯,這樣會使onLoad()中request請求的數據“第一次”無法正常獲取。

我的小程序中所有的requset請求都需要在header中帶著用戶唯一的token進行發(fā)起,而token是在app.js onLaunch()中的wx.login()返回中獲取到的(由code到后臺換日),之后通過wx.setStorageSync('token', res.data)存到小程序中兼砖。要解決問題奸远,就需要解決request請求異步的問題,而且是在兩個js文件之間掖鱼。

使用Promise()

稍微說一下promise

var promise = new Promise(function(resolve, reject) {
 if (/* 異步操作成功 */){
 resolve(value);
 } else {
 reject(error);
 }
});

promise.then(function(value) {
 // success
}, function(value) {
 // failure
});

Promise 構造函數接受一個函數作為參數然走,該函數的兩個參數分別是 resolve 方法和 reject 方法援制。

  • 如果異步操作成功戏挡,則用 resolve 方法將 Promise 對象的狀態(tài),從「未完成」變?yōu)椤赋晒Α梗磸?pending 變?yōu)?resolved)晨仑;
  • 如果異步操作失敗褐墅,則用 reject 方法將 Promise 對象的狀態(tài),從「未完成」變?yōu)椤甘 梗磸?pending 變?yōu)?rejected)洪己。

接下來在小程序中引入promise庫妥凳。到bluebird官網中下載壓縮版本的promise庫。直接打開bluebird.core.min.js答捕,復制代碼逝钥。
Bluebird is a fully featured JavaScript promises library with unmatched performance.
小程序內新建一個promise.js文件,將bluebird.core.min.js中的代碼復制進去拱镐。
app.js中通過require引入:

<!-- app.js -->
const Promise = require('units/promise.js');

這樣就可以在小程序內使用promise了艘款,該庫大小大概在64kb左右持际,可以接受。
接下來直接貼代碼:

<!-- app.js -->
App({
  onLaunch: function(){
    <!-- 調整代碼結構哗咆,原本在此進行的wx.login操作放到下面去 -->
    ...
  },
  //登錄蜘欲,獲取token
  getToken: function(){
    let _this = this;
    return new Promise(function(resolve, reject){
      wx.checkSession({
        success: function (res) { resolve(res); },
        fail: function (res) {
          wx.login({
            success: res => {
              // 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionId
              if (res.code) {
                wx.request({
                  url: CONFIG.loginUrl,
                  data: {
                    code: res.code
                  },
                  header: {
                    'shopId': CONFIG.shopId
                  },
                  method: 'POST',
                  success: res => {
                    wx.setStorageSync('token', res.data);  //儲存返回的token
                    resolve(res);
                  }
                })
              } else {
                console.log('獲取用戶登錄態(tài)失敗晌柬!' + res.errMsg);
                reject('error');
              }
            }
          })
        }
      })
    })
  }
})

接下來在index.js中處理

const app = getApp();
Page({
  onLoad: function(){
    let token = wx.getStorageSync('token');
    if (token == ''){
      //第一次登錄姥份,獲取登錄狀態(tài)
      app.getToken().then(function (res) {
        _this.getData();   //此時token必然已經獲取到,且getData()在此時才會執(zhí)行
      })
    }else{
      //有token的情況直接獲取數據
      _this.getData();
    }
  },
  //獲取數據
  getData: function(){
    wx.request({
      header: {
        'token': wx.getStorageSync('token')
      },
      url: 'https://xxxxx.xxxxx',
      method: 'GET',
      success: res => {
        console.log(res);
      }
    })
  }
})

這時候清除一下開發(fā)工具的緩存年碘,再次編譯頁面澈歉,打開調試面板的network,可以看到index.js中的wx.request請求是在wx.login()的success后才開始的盛泡,這樣就達到了我們的目的闷祥,問題解決。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末傲诵,一起剝皮案震驚了整個濱河市凯砍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拴竹,老刑警劉巖悟衩,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栓拜,居然都是意外死亡座泳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門幕与,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑势,“玉大人,你說我怎么就攤上這事啦鸣〕北ィ” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵诫给,是天一觀的道長香拉。 經常有香客問我,道長中狂,這世上最難降的妖魔是什么凫碌? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮胃榕,結果婚禮上盛险,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好苦掘,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布泉褐。 她就那樣靜靜地躺著,像睡著了一般鸟蜡。 火紅的嫁衣襯著肌膚如雪膜赃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天揉忘,我揣著相機與錄音跳座,去河邊找鬼。 笑死泣矛,一個胖子當著我的面吹牛疲眷,可吹牛的內容都是我干的。 我是一名探鬼主播您朽,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼狂丝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哗总?” 一聲冷哼從身側響起几颜,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讯屈,沒想到半個月后蛋哭,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡涮母,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年谆趾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叛本。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡沪蓬,死狀恐怖,靈堂內的尸體忽然破棺而出来候,到底是詐尸還是另有隱情跷叉,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布吠勘,位于F島的核電站性芬,受9級特大地震影響峡眶,放射性物質發(fā)生泄漏剧防。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一辫樱、第九天 我趴在偏房一處隱蔽的房頂上張望峭拘。 院中可真熱鬧,春花似錦、人聲如沸鸡挠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣展。三九已至彭沼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間备埃,已是汗流浹背姓惑。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留按脚,地道東北人于毙。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像辅搬,于是被迫代替她去往敵國和親唯沮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359