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中文網其他相關文章!