亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript Promise 用法

2019-11-20 09:42:15
字體:
來源:轉載
供稿:網友

同步編程通常來說易于調試和維護,然而,異步編程通常能獲得更好的性能和更大的靈活性。異步的最大特點是無需等待。“Promises”漸漸成為JavaScript里最重要的一部分,大量的新API都開始promise原理實現。下面讓我們看一下什么是promise,以及它的API和用法!

Promises現狀

XMLHttpRequest API是異步的,但它沒有使用promise API。但有很多原生的 javascript API 使用了promise:

*Battery API
*fetch API (XHR的替代品)
*ServiceWorker API

Promises將來只會變得越來越流行、普遍,非常重要,所有的前端開發人員都將用到它。另一個值得注意的是,Node.js是基于Promises的平臺(很顯然,Promise是它的一個核心特征)。

Promises的用法比你想象的要簡單――如果你以前喜歡使用setTimeout來控制異步任務的話!

Promise基本用法

new Promise()構造器可以用在傳統的異步任務中,就像以前 setTimeout 和 XMLHttpRequest 的用法一樣。一個新的 Promise 使用 new 關鍵字生成,同時,這個 Promises 提供了 resolve 和 reject 函數讓我們執行回調操作:

var p = new Promise(function(resolve, reject) {  // Do an async task async task and then... if(/* good condition */) { resolve('Success!'); } else { reject('Failure!'); }});p.then(function() {  /* do something with the result */}).catch(function() { /* error */})

程序員可以手動的在回調函數內部根據執行情況調用 resolve 和 reject 函數。下面是一個比較具有現實意義的例子,它將一個 XMLHttpRequest 調用轉換為 基于 Promises 的任務:

// From Jake Archibald's Promises and Back:// http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequestfunction get(url) { // Return a new promise. return new Promise(function(resolve, reject) {  // Do the usual XHR stuff  var req = new XMLHttpRequest();  req.open('GET', url);  req.onload = function() {   // This is called even on 404 etc   // so check the status   if (req.status == 200) {    // Resolve the promise with the response text    resolve(req.response);   }   else {    // Otherwise reject with the status text    // which will hopefully be a meaningful error    reject(Error(req.statusText));   }  };  // Handle network errors  req.onerror = function() {   reject(Error("Network Error"));  };  // Make the request  req.send(); });}// Use it!get('story.json').then(function(response) { console.log("Success!", response);}, function(error) { console.error("Failed!", error);});

Promise.resolve() 和 Promise.reject() 可以直接被調用。有時候,當判斷出 promise 并不需要真正執行時,我們并不需要 使用 new 創建 Promise 對象,而是可以直接調用 Promise.resolve() 和 Promise.reject()。比如:

var userCache = {};function getUserDetail(username) { // In both cases, cached or not, a promise will be returned if (userCache[username]) {  // Return a promise without the "new" keyword  return Promise.resolve(userCache[username]); } // Use the fetch API to get the information // fetch returns a promise return fetch('users/' + username + '.json')  .then(function(result) {   userCache[username] = result;   return result;  })  .catch(function() {   throw new Error('Could not find user: ' + username);  });}

因為 promise 肯定會返回,所以,我們可以使用 then 和 catch 方法處理返回值!

then 方法

所有的 promise 對象實例里都有一個 then 方法,它是用來跟這個 promise 進行交互的。首先,then 方法會缺省調用 resolve() 函數:

new Promise(function(resolve, reject) { // A mock async action using setTimeout setTimeout(function() { resolve(10); }, 3000);}).then(function(result) { console.log(result);});// From the console:// 10

then 回調動作的觸發時機是 promise 被執行完。我們還可以串聯 then 方法執行回調操作:

new Promise(function(resolve, reject) {  // A mock async action using setTimeout setTimeout(function() { resolve(10); }, 3000);}).then(function(num) { console.log('first then: ', num); return num * 2; }).then(function(num) { console.log('second then: ', num); return num * 2; }).then(function(num) { console.log('last then: ', num);});// From the console:// first then: 10// second then: 20// last then: 40

你會發現,每次 then 調用都會以之前的 then 調用的返回值為參數。

如果一個 promise 已經執行完成,單 then 被再次調用時,回調動作將會被再次執行。而如果這個 promise 里執行的是reject 回調函數,這是再調用 then 方法,回調函數將不會被執行。

catch 方法

catch 當一個 promise 被拒絕(reject)時,catch 方法會被執行:

new Promise(function(resolve, reject) { // A mock async action using setTimeout setTimeout(function() { reject('Done!'); }, 3000);}).then(function(e) { console.log('done', e); }).catch(function(e) { console.log('catch: ', e); });// From the console:// 'catch: Done!'

通常我們在 reject 方法里處理執行失敗的結果,而在catch 里執行異常結果:

reject(Error('Data could not be found'));

Promise.all 方法

在我們的異步調用時經常有這樣一種場景:我們需要同時調用多個異步操作,但希望只有等所有的操作都完成后,我們才去執行響應操作――這就是 Promise.all 的作用。 Promise.all 方法可以接收多個 promise 作為參數,以數組的形式,當這些 promise 都成功執行完成后才調用回調函數。

Promise.all([promise1, promise2]).then(function(results) { // Both promises resolved}).catch(function(error) { // One or more promises was rejected});

一個很好的能演示 Promise.all 用法的例子是,執行多個 AJAX 操作(通過 fetch) 調用:

var request1 = fetch('/users.json');var request2 = fetch('/articles.json');Promise.all([request1, request2]).then(function(results) { // Both promises done!});

我們還可將fetch和電池狀態API混合一起執行,因為它們返回的都是 promise:

Promise.all([fetch('/users.json'), navigator.getBattery()]).then(function(results) { // Both promises done!});

一旦 promise 里調用了reject函數,也就是執行被拒絕了,沒有能夠正常完成,情況會有些復雜。一旦 promise 被拒絕,catch 方法會捕捉到首個被執行的reject函數:

var req1 = new Promise(function(resolve, reject) {  // A mock async action using setTimeout setTimeout(function() { resolve('First!'); }, 4000);});var req2 = new Promise(function(resolve, reject) {  // A mock async action using setTimeout setTimeout(function() { reject('Second!'); }, 3000);});Promise.all([req1, req2]).then(function(results) { console.log('Then: ', one);}).catch(function(err) { console.log('Catch: ', err);});// From the console:// Catch: Second!

Promise.all 是非常重要的接口,將會在很多新誕生的 promise API中扮演重要的作用。

Promise.race

Promise.race 是一個有趣的函數――它不是等待所有的 promise 被resolve 或 reject,而是在所有的 promise 中只要有一個執行結束,它就會觸發:

var req1 = new Promise(function(resolve, reject) {  // A mock async action using setTimeout setTimeout(function() { resolve('First!'); }, 8000);});var req2 = new Promise(function(resolve, reject) {  // A mock async action using setTimeout setTimeout(function() { resolve('Second!'); }, 3000);});Promise.race([req1, req2]).then(function(one) { console.log('Then: ', one);}).catch(function(one, two) { console.log('Catch: ', one);});// From the console:// Then: Second!

一個有用的場景是,從多個鏡像服務器下載資源,一旦有一個返回,其它的返回也就不用處理了。

學會使用 Promises

Promises在過去幾年是一個非常火爆的話題,它甚至從JavaScript里抽離出來變成了一個語言架構。相信很快我們將見到有愈來愈多的JavaScript API將使用以promise為基礎的模式。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久影视| 日本精品免费一区二区三区| 成人免费午夜电影| 精品久久久久久亚洲国产300| 中文字幕av一区| 日韩在线视频免费观看高清中文| 久久久久久国产免费| 欧美猛交ⅹxxx乱大交视频| 亚洲香蕉在线观看| 欧美性xxxxhd| 久久久久免费视频| 日韩专区中文字幕| 国产日韩在线精品av| 国外日韩电影在线观看| 成人精品aaaa网站| 国外色69视频在线观看| 国产精品成人国产乱一区| 久久高清视频免费| 影音先锋日韩有码| 日韩av综合网站| 国产精品99一区| 久久久久久久色| 97在线观看免费高清| 精品国产自在精品国产浪潮| 7777免费精品视频| 狠狠躁夜夜躁人人爽天天天天97| 国产日韩欧美日韩大片| 欧美一级淫片播放口| 91视频国产一区| 奇米成人av国产一区二区三区| 色婷婷综合成人av| 欧美壮男野外gaytube| 5278欧美一区二区三区| 色多多国产成人永久免费网站| 亚洲成**性毛茸茸| 丝袜亚洲欧美日韩综合| 中文字幕亚洲在线| 精品国产乱码久久久久久婷婷| 日韩av一区二区在线观看| 国产精品麻豆va在线播放| 亚洲成人激情小说| 亚洲精品成人久久| 欧美激情乱人伦一区| 狠狠躁天天躁日日躁欧美| 久久国产一区二区三区| 久久精品视频导航| 尤物99国产成人精品视频| 欧美日韩xxx| 日韩在线视频观看正片免费网站| 日韩电影在线观看免费| 欧美成人免费观看| 日韩美女写真福利在线观看| 国产精品99免视看9| 国产啪精品视频| 九九精品视频在线| 青青久久av北条麻妃黑人| 在线成人激情视频| 国产日韩av高清| 青草热久免费精品视频| 日韩av影视综合网| 欧美极品在线视频| 91在线免费观看网站| 日韩中文字幕网| 亚洲美女又黄又爽在线观看| 久久久噜噜噜久噜久久| 国产精自产拍久久久久久| 欧美激情中文网| 久久久免费高清电视剧观看| 亚洲最大福利网站| 4p变态网欧美系列| 国产精品久久激情| 亚洲精品视频在线观看视频| 中日韩午夜理伦电影免费| 欧美日韩在线免费观看| 亚洲91精品在线| 亚洲精品www| 国产亚洲精品久久久| 亚洲国产精品字幕| 亚洲一区二区在线| 色婷婷av一区二区三区在线观看| 日韩精品极品视频免费观看| 97在线免费视频| 自拍亚洲一区欧美另类| 欧美视频国产精品| 国产成人拍精品视频午夜网站| 欧美国产第二页| 精品久久久视频| 日韩在线观看电影| 欧美亚洲国产日本| 久久精品电影一区二区| 久久久久久久国产精品| 亚洲精品98久久久久久中文字幕| 亚洲欧美成人精品| 久热精品视频在线观看| 奇米影视亚洲狠狠色| 国内久久久精品| 亚洲成色999久久网站| 国产精品劲爆视频| 精品人伦一区二区三区蜜桃网站| 国产一区玩具在线观看| 国产精品美女在线| 26uuu另类亚洲欧美日本一| 91免费高清视频| 日韩精品一区二区三区第95| 欧美日韩免费网站| 欧美国产极速在线| 成人国产精品一区二区| 欧美精品久久久久| 精品露脸国产偷人在视频| 国产精品激情av在线播放| 国产精品久久久久久久7电影| 色yeye香蕉凹凸一区二区av| 97久久精品视频| 欧美日韩国产一区中文午夜| 国产精品69久久久久| www.xxxx精品| 欧美电影院免费观看| 成人免费xxxxx在线观看| 91九色视频在线| 精品中文字幕在线| 一区二区三区四区视频| 欧美成人精品影院| 91色精品视频在线| 国产成人av在线| 中文字幕视频在线免费欧美日韩综合在线看| 中文字幕欧美日韩精品| 国产成人精品免高潮费视频| 92看片淫黄大片看国产片| 国产精品亚洲一区二区三区| 国产日韩亚洲欧美| 亚洲xxxx在线| 久久人体大胆视频| 亚洲一区精品电影| 久久成人精品一区二区三区| 亚洲成人黄色网址| 91久久精品视频| 国产一区二区三区免费视频| 国产成人极品视频| 中文字幕亚洲精品| 成人黄色在线播放| 久久五月天综合| 2019av中文字幕| 韩国欧美亚洲国产| 久久国产精品久久久久| 国产精品专区一| 欧美激情亚洲另类| 久久精品国产久精国产思思| 日韩成人激情在线| 亚洲精品国产精品乱码不99按摩| 尤物精品国产第一福利三区| 日韩免费看的电影电视剧大全| 免费91麻豆精品国产自产在线观看| 亚洲精品美女网站| xvideos成人免费中文版| 丝袜美腿精品国产二区| 日韩成人在线网站| 欧美最猛性xxxxx亚洲精品| 欧美日韩一区二区精品| 欧美大片在线免费观看| 北条麻妃久久精品| 视频在线观看一区二区| 色哟哟网站入口亚洲精品| 欧美性猛交视频| 亚洲一区二区三区乱码aⅴ蜜桃女|