Promise 的四种经常使用要领。

媒介

看到项目里不少人用了Promise 的库类,比方 bluebird、q 、jQuery.Deffered 等 polyfill promise 体式格局,运用的时刻翻看长长的文档,真心累觉不爱。
es5 生长到现在,node 在0.12版本就已支撑了promise, 在客户端,大部分浏览器也支撑了Promise, 假如要兼容低版本的浏览器,能够加上es5-shimpolyfill promise

用法

Promise 经常使用三个场景。

  • 处置惩罚异步回调

  • 多个异步函数同步处置惩罚

  • 异步依靠异步回调

  • 封装一致的进口方法或许错误处置惩罚

处置惩罚异步回调

Promise 的基础用法, 处置惩罚异步回调。

function Pro1(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro1')
        }, 300)
    })
}
//挪用
Pro1()
.then(function(data){
    console.log(data) //pro1
})
.catch(function(err){
    throw new Error(err)
})

多个异步函数同步处置惩罚

有时刻我们须要发送两个ajax,愿望他们能一同把数据返回,就能够采纳下面的方法。

function Pro1(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro1')
        }, 300)
    })
}
function Pro2(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro2')
        }, 300)
    })
}
//挪用
var Pro = Promise.all([Pro1(), Pro2()]);
Pro
.then(function(data){
    console.log(data[0], data[1]) //Pro1 Pro2
})
.catch(function(err){
    throw new Error(err)
})

异步依靠异步回调

有些场景是一个异步依靠另一个异步的返回值的,就能够采纳下面的用法。
比方: 用一个定单号异步取到定单概况,再用定单概况里的商品Id获取到商品概况。

function Pro1(orderId){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            var orderInfo = {
                orderId: orderId,
                productIds: ['123', '456']
            }
            resolve(orderInfo.productIds)
        }, 300)
    })
}
function Pro2(productIds){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            var products = productIds.map(function(productId){
                return {
                    productId: productId,
                    name: '衣服'
                }
            })
            resolve(products)
        }, 300)
    })
}
//挪用

Pro1('abc123')
.then(function(productIds){
    console.log('商品id',productIds) 
    return Pro2(productIds)
})
.then(function(products){
    console.log('商品概况',products) 
})
.catch(function(err){
    throw new Error(err)
})

封装一致的进口方法或许错误处置惩罚

错误处置惩罚

function ErrorHandler(promiseObj, rejectOrResOrCallback){
    return promiseObj.then(null, function(err){
    if(!err)
    })
}
    原文作者:combine
    原文地址: https://segmentfault.com/a/1190000005894077
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞