微信小程序异步API为Promise简化异步编程,把微信小程序异步API转为Promise

把微信小程序异步API转化为Promise。用Promise管理异步操作有多造福,什么人用哪个人知道。
微信官方并没有提交Promise
API来处理异步操作,而官方API异步的又十分多,那使得多异步编程会层层回调,代码1错综相连,回调起来就想砸Computer。
于是乎写了一个通用工具,把微信官方的异步API转化为Promise,方便管理(多)异步操作。

把微信小程序异步API转化为Promise。用Promise管理异步操作有多方便,何人用哪个人知道。

把微信小程序异步API转化为Promise。用Promise管理异步操作有多造福,何人用什么人知道。微信官方没有交到Promise
API来拍卖异步操作,而官方API异步的又不行多,这使得多异步编制程序会层层回调,代码一繁杂,回调起来就想砸计算机。

 在写Node.js的进度中,接二连三的IO操作大概会导致“金字塔恐怖的梦”,回调函数的多种嵌套让代码变的难以保证,利用CommonJs的Promise来封装异步函数,使用统壹的链式API来解脱多种回调的恶梦。

您能够这么用:

微信官方并未交到Promise
API来管理异步操作,而官方API异步的又足够多,那使得多异步编制程序会层层回调,代码一犬牙相错,回调起来就想砸Computer。

亚洲必赢官网 1

  Node.js提供的非阻塞IO模型允许我们利用回调函数的点子管理IO操作,可是当须求连接的IO操作时,你的回调函数会多种嵌套,代码很不佳看,而且不易维护,而且或然会有广大错误管理的再度代码,也正是所谓的“Pyramid
of Doom”。

预备倒车后的方式并暴表露

于是乎写了2个通用工具,把微信官方的异步API转化为Promise,方便处理(多)异步操作。

于是乎写了1个通用工具,把微信官方的异步API转化为Promise,方便管理异步操作。你能够如此用:绸缪倒车后的不二法门并暴流露

复制代码 代码如下:

// /utils/wx-promise.js
import toPromise from '/module/to-promise/src/index'

const toPromiseWx = toPromsie(wx)

export const request = toPromiseWx('requset')
export const getLocation = toPromiseWx('getLocation')
export const setStorage = toPromiseWx('setStorage')

//export 其他你项目中可能用到的异步API

你能够那样用:

// /utils/wx-promise.jsimport toPromise from '/module/to-promise/src/index'const toPromiseWx = toPromsieexport const request = toPromiseWx('requset')export const getLocation = toPromiseWx('getLocation')export const setStorage = toPromiseWx('setStorage')//export 其他你项目中可能用到的异步API

step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                // Do something with value4
            });
        });
    });
});

在其余文件中应用
在App.js中使用:

预备倒车后的措施并暴暴光

在别的文件中行使在App.js中央银行使:

  那实际正是Node.js的Control
flow的难点,对于那个主题材料,化解方案都游人如织,比如采纳async,大概eventProxy等,可是本文的核心是选取CommonJs典型中对Promise来缓慢解决那个主题材料。

//App.js
import { request } from './utils/wx-promise.js'

App({
  onLanuch: () => {
    request({ url: 'http://api.yourapi.com' })
      .then(() => {
        //成功后处理
      })
      .then(() => {
        //失败后处理
      })
  }
})
// /utils/wx-promise.js
import toPromise from '/module/to-promise/src/index'
const toPromiseWx = toPromsie(wx)
export const request = toPromiseWx('requset')
export const getLocation = toPromiseWx('getLocation')
export const setStorage = toPromiseWx('setStorage')
//export 其他你项目中可能用到的异步API
`//App.js``import { request } from` `'./utils/wx-promise.js'``App({``onLanuch: () => {``request({ url:` `'[http://api.yourapi.com](http://api.yourapi.com/)'` `})``.then => {``//成功后处理``})``.then => {``//失败后处理``})`//欢迎加入全栈开发交流圈一起学习交流:864305860`}``})`

什么是Promise?

在其他page中使用:

在其余文件中使用

在其他page中使用:

  CommonJs的Promise标准有广大种,大家一般探讨的是Promise/A+规范,它定义了Promise的中坚行为。

// /page/index.js
import { request, setStorage } from '../utils/wx-promise.js'

page({
  onLoad: () => {
    request({ url: 'http://api.yourapi.com' })
      .then(() => {
        //成功后处理
      })
      .then(() => {
        //失败后处理
      })
  },
  onHide: () => {
    setStorage({
      key: 'yourkey',
      data: 'yourvalue'
    })
      .then(() => {
        //保存成功
      })
      .then(() => {
        //保存失败
      })
  }
})

亚洲必赢官网 ,在App.js中使用:

`// /page/index.js``import { request, setStorage } from` `'../utils/wx-promise.js'``page({``onLoad: () => {``request({ url:` `'[http://api.yourapi.com](http://api.yourapi.com/)'` `})``.then => {``//成功后处理``})``.then => {``//失败后处理``})``},``onHide: () => {``setStorage({``key:` `'yourkey'``,``data:` `'yourvalue'``})``.then => {``/保存成功``})``.then => {``//保存失败``})``}`//欢迎加入全栈开发交流圈一起学习交流:864305860`})`

  Promise是四个对象,它一般代表二个在未来讲不定造成的异步操作。那么些操作大概成功也恐怕倒闭,所以多个Promise对象一般有2个状态:Pending,Fulfilled,Rejected。分别表示未变成、成功做到和操作败北。1旦Promise对象的气象从Pending造成Fulfilled大概Rejected任性3个,它的景色都并未主意再被退换。

项目地址:to-promise

//App.js
import { request } from './utils/wx-promise.js'

App({
 onLanuch: () => {
  request({ url: 'http://api.yourapi.com' })
   .then(() => {
    //成功后处理
   })
   .then(() => {
    //失败后处理
   })
 }
})

to-promise是1个转换微信小程序异步API为Promise的一个工具库优点:幸免小程序异步编制程序数十次回调带来的过多回调导致逻辑不清晰,篇幅过长等主题素材。借助于Promise异步编制程序特点,辅助链式操作,像一道一样写异步。转化后得API差不多和微信官方API同样。使用办法:安装使用git安装到花色根目录/module,

微信小程序异步API为Promise简化异步编程,把微信小程序异步API转为Promise。  叁个Promise对象经常会有1个then方法,这几个艺术让我们得以去操作以后恐怕得逞后赶回的值恐怕是败退的缘由。那一个then方法是那样子的:

其余越来越多更切实用法,间接粘贴README了,如下。

在其他page中使用:

git clone https://github.com/tornoda/to-promise或直接下载放入项目目录下如:/module在需要用到的地方引入import toPromise from '/module/to-promise/src/index'绑定微信全局对象到函数,以便可以取到微信得APIconst toPromiseWx = toPromise开始转化你需要得异步API//apiName为微信异步方法名,如对wx.request()进行转化const request = toPromiseWx('request')//直接使用request方法

promise.then(onFulfilled, onRejected)
  由此可见的是,then方法接受七个参数,它们平常是多少个函数,2个是用来处理操作成功后的结果的,另四个是用来拍卖操作失利后的因由的,那多少个函数的第一个参数分别是马到功成后的结果和歇业的由来。假如传给then方法的不是三个函数,那么这几个参数会被忽视。


// /page/index.js
import { request, setStorage } from '../utils/wx-promise.js'

page({
 onLoad: () => {
  request({ url: 'http://api.yourapi.com' })
   .then(() => {
    //成功后处理
   })
   .then(() => {
    //失败后处理
   })
 },
 onHide: () => {
  setStorage({
   key: 'yourkey',
   data: 'yourvalue'
  })
   .then(() => {
    //保存成功
   })
   .then(() => {
    //保存失败
   })
 }
})

举例:

  then方法的重返值是一个Promise对象,这3个特点允许大家链式调用then来达到调整流程的功用。这里有不少细节上的主题材料,比方值的传递只怕错误管理等。Promise的科班是这么定义的:

to-promise是3个转移微信小程序异步API为Promise的一个工具库

品种地址:to-promise

import toPromise from '/module/to-promise/src/index'//转换wx.getStorage()const getStorage = toPromsie('getStorage') //使用getStorage({ key: 'test' }) .then(//欢迎加入全栈开发交流圈一起学习交流:864305860  => { //res的值与wx.getStorage({ success:  => {} })中的res值一样 //res = {data: 'keyValue'} console.log//控制台打印storage中key对于的value return res.data//如果需要继续链式调用转化后的api,需要把值显示返回 },  => { //err的值与wx.getStorage({ success:  => {} })中的err值一样 throw err } )//欢迎加入全栈开发交流圈一起学习交流:864305860

onFulfilled或许onRejected函数的重返值不是Promise对象,则该值将会作为下叁个then方法中onFulfilled的首先个参数,假设重临值是1个Promise对象,怎么then方法的再次来到值就是该Promise对象
onFulfilled只怕onRejected函数中壹旦有卓殊抛出,则该then方法的归来的Promise对象情状转为Rejected,若是该Promise对象调用then,则Error对象会作为onRejected函数的第叁个参数
若是Promise状态变为Fulfilled而在then方法中绝非提供onFulfilled函数,则then方法重临的Promise对象情形变为Fulfilled且成功的结果为上1个Promise的结果,Rejected同理。
  补充一句,onFulfilled和onRejected都以异步实践的。

优点:

别的更加多更实际用法,直接粘贴README了,如下。

重临:
参数为小程序异步方法名。重临四个函数,该函数的参数与再次回到值如下。参数:
对应wx小程序异步方法中的参数除去success与fail后的目的。举个例子:官方APIwx.getLocation的OBJECT接受如下属性:
type altitude success fail complete,那么去除(success fail)后为:type
altitude complete。重回: (pending Promsise)
重回四个茫然状态的Promise对象,在该目标上调用.then(onFulfilled,
onRejected)方法来拍卖对用成功或停业的场地。onFulfilled为呼吁成功后调用的回调函数,参数为重临值,onRejected为呼吁失利后的回调函数,参数为回到的错误音信。不难题来讲,

专门的学业的贯彻:q

  1. 制止小程序异步编制程序数十次回调带来的过多回调导致逻辑不明晰,篇幅过长等主题材料。
  2. 依附Promise异步编制程序特点,支持链式操作,像1块同样写异步。
  3. 转车后得API大概和微信官方API同样。

to-promise是三个转变微信小程序异步API为Promise的1个工具库

const getLocation = toPromiseWx('getLocation')getLocation({ type: 'wgs84', altitude: true, complete: () => { console.log('to-promsise is awesome') }}).then => {//dosomething if succeed},  => {//dosomething if failed})

  上边讲的是Promise的正式,而小编辈必要的是它的得以完毕,q是1个对Promise/A+有着较好贯彻标准的库。

选取办法:

优点:

与下部官方调用等价

  首先大家须求创造1个Promise对象,关于Promise对象制造的正规在Promise/B中,这里不做详细的表达,直接上代码。

  1. 安装

制止小程序异步编制程序多次回调带来的过多回调导致逻辑不清楚,篇幅过长等难点。
借助Promise异步编制程序特点,支持链式操作,像二头同样写异步。
转折后得API差不离和微信官方API同样。

wx.getLocation({ type: 'wgs84',//欢迎加入全栈开发交流圈一起学习交流:864305860 altitude: true, complete: () => { console.log('to-promsise is awesome') }, success:  => {//dosomething if succeed}, fail:  => {//dosomething if failed}})

复制代码 代码如下:

  • 使用git安装到项目根目录/module,

应用形式:

运用场景比方单次异步调用,参见API最终往往异步操作调用,且每下二次调用都会用到前一遍回到的结果。如:得到GPS新闻后,依据GPS音讯得到天气音信,获得天气新闻后立马存入localStorage。

    function(flag){
        var defer = q.defer();
        fs.readFile(“a.txt”, function(err, data){
        if(err) defer.reject(err);
            else defer.resolve(data);
            });
            return defer.promise;
    }

安装

`import toPromise from` `'/module/to-promise/src/index'``const toPromiseWx = toPrmise``//方法转换``const getLocation = toPromiseWx(``'getLocation'``)``const request = toPromiseWx(``'request'``)``const setStorage = toPromiseWx(``'setStorage'``)``//链式写逻辑``getLocation()` `//获取位置信息``.then => {` `//位置获取成功后的处理,res为返回信息``//处理res后返回有用的信息,这里直接返回res,用于演示``return` `Promise.resolve` `//必须``},`` => {` `//位置获取失败后的错误处理,err为错误信息``//错误处理``return` `Promise.resolve` `//必须``}``)``.then => {` `//根据位置获取成功后的信息,请求天气信息``return` `request({ url:` `'[http://api.weather.com](http://api.weather.com/)'``}) //返回一个pending 状态下的Promise``}``)`//帮助突破技术瓶颈,提升思维能力`.then => {` `//天气获取成功后存入storage的回调``setStorage({``key:` `'test'``,``data:` `'res'``})``},`` => {``//天气获取失败后执行这里,err为获取天气失败的错误信息``}``)`

  诸多Promise的贯彻在Promise的创办上海大学同小异,通过创办贰个独具promise属性的defer对象,假如成功收获到值则调用defer.resolve(value),假诺战败,则调用defer.reject(reason),最终回来defer的promise属性就可以。那么些历程能够掌握为调用defer.resolve将Promise的情景产生Fulfilled,调用defer.reject将Promise的场馆产生Rejected。

git clone https://github.com/tornoda/to-promise

使用git安装到品种根目录/module,

要是应用官方的API写上述逻辑,代码是那样的:

  在面对一类别接二连三的异步方法时,怎么使用Promise写出特出的代码呢?看下下边包车型大巴例子。

  • 或直接下载放入项目目录下如:/module
git clone https://github.com/tornoda/to-promise
或直接下载放入项目目录下如:/module
在需要用到的地方引入
import toPromise from '/module/to-promise/src/index'
绑定微信全局对象(wx)到函数,以便可以取到微信得API
const toPromiseWx = toPromise(wx)
开始转化你需要得异步API
//apiName为微信异步方法名,如对wx.request()进行转化
const request = toPromiseWx('request')
//直接使用request方法
`wx.getLocation({``success:  => {``//some transformation with res``wx.request({``url:` `'[http://api.weather.com](http://api.weather.com/)'``,``success:  => {``wx.setStorage({``success: () => {``//do something``},``fail:  => {``//do something if err happend``}``})``},``fail:  => {``//do something if err happend``}`//欢迎加入全栈开发交流圈一起学习交流:864305860`})`//面向1-3年前端人员`},`//帮助突破技术瓶颈,提升思维能力`fail:  => {``//do something if err happend``})``//层层回调,麻烦

复制代码 代码如下:

  1. 在须求选取的地方引进

举例:

结语

    promise0.then(function(result){
        // dosomething
        return result;
    }).then(function(result) {
        // dosomething
        return promise1;   
    }).then(function(result) {
        // dosomething
    }).catch(function(ex) {
        console.log(ex);
    }).finally(function(){
        console.log(“final”);
    });

import toPromise from '/module/to-promise/src/index'
//转换wx.getStorage()
const getStorage = toPromsie(wx)('getStorage') 
//使用
getStorage({ key: 'test' })
 .then(
  (res) => {
   //res的值与wx.getStorage({ success: (res) => {} })中的res值一样
   //res = {data: 'keyValue'}
   console.log(res.data)//控制台打印storage中key对于的value
   return res.data//如果需要继续链式调用转化后的api,需要把值显示返回
  },
  (err) => {
   //err的值与wx.getStorage({ success: (err) => {} })中的err值一样
   throw err
  }
 )

多谢您的来看,如有不足之处,接待讨论指正。

  在上头的代码中,then方法只接受OnFulfilled,而catch方法其实正是then(null,
OnRejected),那样的话只要一名目许多异步方法只要始终是大功告成重临值的,那么代码就能瀑布式的向下运维,假设中间私自二个异步方法失利只怕爆发特别,那么依据CommonJs的Promise标准,将实施catch中的function。q还提供了finally方法,从字面上也很好通晓,就是不论resolve依然reject,最后都会实行finally中的function。

import toPromise from '/module/to-promise/src/index'

有关Promise对象的运用,请参见Promise

此番给大家推荐1个无偿的学习群,里面包含移动采纳网址开采,css,html,webpack,vue
node
angular以及面试财富等。对web开拓技艺感兴趣的同窗,接待参加Q群:864305860,不管你是小白依旧大咖作者都迎接,还有大腕整理的一套高功用学习路径和课程与您免费享用,同时天天更新摄像资料。最终,祝大家早日成功,获得满足offer,急速升职加薪,走上人生巅峰。

  看上去就像不错,代码更以维护且雅观了,那么只要期待出现呢?

  1. 绑定微信全局对象(wx)到函数,以便能够取到微信得API

API

复制代码 代码如下:

toPromise(global)

     q.all([promise0, promise1, promise2]).spread(function(val0, val1,
val2){
                    console.log(arguments);
                }).then(function(){
                    console.log(“done”);
                }).catch(function(err){
                    console.log(err);
                });

const toPromiseWx = toPromise(wx)

参数

  q也为出现提供了api,调用all方法并传递3个Promise数组就可以继续选择then的链式风格。还有像q.nfbind等得以将Node.js的原生API转化成Promise来归并代码格式也是挺好的。越来越多api在此地就不1一详述了。

  1. 开首倒车你须求得异步API

(wx): wx全局对象。即toPromise(wx)那样调用

结论

返回

  本文首要介绍通过利用Promise来减轻Node.js调节流难点,但Promise也可同等应用于前端,EMCAScript6早就提供了原生的API协助。供给提议的是Promise并不是当世无双的减轻方案,async也是四个很好的挑选,并且提供更和谐的产出调控API,但是作者觉着Promise在封装具备异步方法的函数时更具优势。

//apiName为微信异步方法名,如对wx.request()进行转化
const request = toPromiseWx('request')
//直接使用request方法

(function):
参数(string)为小程序异步方法名。再次来到1个函数,该函数的参数与重回值如下。

好了,本文就先到那边了,希望对大家能够具有帮忙。

举例:

参数:(object)
对应wx小程序异步方法中的参数(OBJECT)除去success与fail后的目的。比如:

你恐怕感兴趣的篇章:

  • 比如详解JavaScript中Promise的采纳
  • JavaScript中的Promise使用详解
  • JavaScript Promise 用法
  • JavaScript异步编制程序Promise形式的陆性情子
  • 理解JavaScript中Promise的使用
  • 详细解读JavaScript编制程序中的Promise使用
  • JavaScript异步回调的Promise情势封装实例
  • Javascript中的异步编制程序规范Promises/A详细介绍
  • NodeJS的Promise的用法解析
  • JS中Promise函数then的精深研究
import toPromise from '/module/to-promise/src/index'

//转换wx.getStorage()
const getStorage = toPromsie(wx)('getStorage') 

//使用
getStorage({ key: 'test' })
  .then(
    (res) => {
      //res的值与wx.getStorage({ success: (res) => {} })中的res值一样
      //res = {data: 'keyValue'}
      console.log(res.data)//控制台打印storage中key对于的value
      return res.data//如果需要继续链式调用转化后的api,需要把值显示返回
    },
    (err) => {
      //err的值与wx.getStorage({ success: (err) => {} })中的err值一样
      throw err
    }
  )

合法APIwx.getLocation(OBJECT)的OBJECT接受如下属性: type altitude
success fail complete,那么去除(success fail)后为:type altitude
complete。

有关Promise对象的应用,请参见Promise

回到: (pending Promsise)
再次来到三个不解状态的Promise对象,在该目的上调用.then(onFulfilled,
onRejected)方法来拍卖对用成功或退步的情景。onFulfilled为呼吁成功后调用的回调函数,参数为重回值,onRejected为呼吁战败后的回调函数,参数为回到的错误消息。

API

轻便易行点以来,

  • toPromise(global)
const getLocation = toPromiseWx('getLocation')
getLocation({
 type: 'wgs84',
 altitude: true,
 complete: () => { console.log('to-promsise is awesome') }
}).then(
 (res) => {//dosomething if succeed},
 (err) => {//dosomething if failed}
)

参数

与下部官方调用等价

(wx): wx大局对象。即toPromise(wx)那样调用

wx.getLocation({
 type: 'wgs84',
 altitude: true,
 complete: () => { console.log('to-promsise is awesome') },
 success: (res) => {//dosomething if succeed},
 fail: (err) => {//dosomething if failed}
})

返回

运用场景比如

(function):
参数(string)为小程序异步方法名。再次回到一个函数,该函数的参数与重回值如下。

  • 单次异步调用,参见API最后
  • 反复异步操作调用,且每下三回调用都会用到前3遍回到的结果。

参数:(object)
对应wx小程序异步方法中的参数(OBJECT)除去successfail后的对象。比方:

如:得到GPS音信后,依照GPS音信得到天气音信,取得天气消息后立马存入localStorage。

官方APIwx.getLocation(OBJECT)OBJECT接受如下属性: type
altitude success fail complete,那么去除(success
fail)后为:type altitude complete

import toPromise from '/module/to-promise/src/index'
const toPromiseWx = toPrmise(wx)
//方法转换
const getLocation = toPromiseWx('getLocation')
const request = toPromiseWx('request')
const setStorage = toPromiseWx('setStorage')
//链式写逻辑
getLocation() //获取位置信息
 .then(
  (res) => { //位置获取成功后的处理,res为返回信息
   //处理res后返回有用的信息,这里直接返回res,用于演示
   return Promise.resolve(res) //必须
  },
  (err) => { //位置获取失败后的错误处理,err为错误信息
   //错误处理
   return Promise.resolve(err) //必须
  }
 )
 .then(
  (res) => { //根据位置获取成功后的信息,请求天气信息
   return request({ url: 'http://api.weather.com'}) //返回一个pending 状态下的Promise
  }
 )
 .then(
  (res) => { //天气获取成功后存入storage的回调
   setStorage({
    key: 'test',
    data: 'res'
   })
  },
  (err) => {
   //天气获取失败后执行这里,err为获取天气失败的错误信息
  }
 )

返回: (pending Promsise)
重临一个未知状态的Promise对象,在该目标上调用.then(onFulfilled,
onRejected)方法来拍卖对用成功或倒闭的场地。onFulfilled为呼吁成功后调用的回调函数,参数为重回值,onRejected为呼吁战败后的回调函数,参数为回到的错误新闻。

比方利用官方的API写上述逻辑,代码是这么的:

粗略点以来,

wx.getLocation({
 success: (res) => {
  //some transformation with res
  wx.request({
   url: 'http://api.weather.com',
   success: (res) => {
    wx.setStorage({
     success: () => {
      //do something
     },
     fail: (err) => {
      //do something if err happend
     }
    })
   },
   fail: (err) => {
    //do something if err happend
   }
  })
 },
 fail: (err) => {
  //do something if err happend
})
//层层回调,如果逻辑再复杂点,可能就疯了
const getLocation = toPromiseWx('getLocation')
getLocation({
  type: 'wgs84',
  altitude: true,
  complete: () => { console.log('to-promsise is awesome') }
}).then(
  (res) => {//dosomething if succeed},
  (err) => {//dosomething if failed}
)

总结

与下部官方调用等价

如上所述是我给我们介绍的微信小程序异步API为Promise简化异步编制程序,希望对大家全部协助,假诺我们有任何疑问请给自家留言,作者会及时复苏我们的。在此也格外感激大家对台本之家网址的支撑!

wx.getLocation({
  type: 'wgs84',
  altitude: true,
  complete: () => { console.log('to-promsise is awesome') },
  success: (res) => {//dosomething if succeed},
  fail: (err) => {//dosomething if failed}
})

你只怕感兴趣的小说:

  • 微信小程序之付出后调用SDK的异步通告及表明处理订单方法
  • 微信小程序异步管理详解
  • 微信小程序中使用Promise进行异步流程管理的实例详解
  • 详解微信小程序
    同步异步化解办法
  • 微信小程序
    wx.request方法的异步封装实例详解
  • 微信小程序
    缓存(本地缓存、异步缓存、同步缓存)详解

采取场景举个例子

  1. 单次异步调用,参见API最终
  2. 几度异步操作调用,且每下二回调用都会用到前一遍回到的结果。
    如:获得GPS音讯后,根据GPS新闻获得天气音信,猎取天气音讯后立马存入localStorage。

import toPromise from '/module/to-promise/src/index'

const toPromiseWx = toPrmise(wx)

//方法转换
const getLocation = toPromiseWx('getLocation')
const request = toPromiseWx('request')
const setStorage = toPromiseWx('setStorage')

//链式写逻辑
getLocation() //获取位置信息
  .then(
    (res) => { //位置获取成功后的处理,res为返回信息
      //处理res后返回有用的信息,这里直接返回res,用于演示
      return Promise.resolve(res) //必须
    },
    (err) => { //位置获取失败后的错误处理,err为错误信息
      //错误处理
      return Promise.resolve(err) //必须
    }
  )
  .then(
    (res) => { //根据位置获取成功后的信息,请求天气信息
      return request({ url: 'http://api.weather.com'}) //返回一个pending 状态下的Promise
    }
  )
  .then(
    (res) => {  //天气获取成功后存入storage的回调
      setStorage({
        key: 'test',
        data: 'res'
      })
    },
    (err) => {
      //天气获取失败后执行这里,err为获取天气失败的错误信息
    }
  )

假若利用官方的API写上述逻辑,代码是这么的:

wx.getLocation({
  success: (res) => {
    //some transformation with res
    wx.request({
      url: 'http://api.weather.com',
      success: (res) => {
        wx.setStorage({
          success: () => {
            //do something
          },
          fail: (err) => {
            //do something if err happend
          }
        })
      },
      fail: (err) => {
        //do something if err happend
      }
    })
  },
  fail: (err) => {
    //do something if err happend
})
//层层回调,如果逻辑再复杂点,可能就疯了
网站地图xml地图