首頁  >  文章  >  web前端  >  Promise概述與常用方法介紹

Promise概述與常用方法介紹

零下一度
零下一度原創
2017-07-16 14:46:232137瀏覽

Promise概述

Promise物件是CommonJS工作小組提出的一種規範,目的是為非同步操作提供統一介面。

那麼,什麼是Promises?

首先,它是一個對象,也就是說與其他JavaScript對象的用法,沒有什麼兩樣;其次,它起到代理作用(proxy),充當非同步操作與回呼函數之間的中介。它使得非同步操作具備同步操作的接口,使得程式具備正常的同步運行的流程,回呼函數不必再一層層嵌套。

簡單說,它的想法是,每個非同步任務立刻返回一個Promise對象,由於是立刻返回,所以可以採用同步操作的流程。這個Promises物件有一個then方法,允許指定回調函數,在非同步任務完成後呼叫。

例如,非同步操作f1傳回一個Promise對象,它的回呼函數f2寫法如下。

(new Promise(f1)).then(f2);

#前言

Promise是JavaScript非同步操作解決方案,最近看到專案裡不少人用了Promise 的庫類,例如bluebird、q 、jQuery.Deffered 等polyfill promise 方式,使用的時候翻看長長的​​文檔,真心累覺不愛。

es5 發展到現在,node 在0.12版本就已經支援了promise, 在客戶端,大部分瀏覽器也支援了Promise, 如果要相容低版本的瀏覽器,可以加上es5 -shim等polyfill 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)
 })
}

以上是Promise概述與常用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn