日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Javacript和AngularJS中的Promises

發布時間:2023/12/18 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javacript和AngularJS中的Promises 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

promise是Javascript異步編程很好的解決方案。對于一個異步方法,執行一個回調函數。

比如頁面調用google地圖的api時就使用到了promise。

?

function success(position){var cords = position.coords;console.log(coords.latitude + coords.longitude); }function error(err){console.warn(err.code+err.message) }navigator.geolocation.getCurrentPosition(success, error);

?

■ 如何處理多個異步方法

如果有很多異步方法需要按序執行呢?async1(success, failure), async2(success, failure), ...asyncN(success, failure),該如何處理呢?

最簡單的,可能會這樣寫:

?

async1(function(){async2(function(){...asyncN(null, null);...}, null) }, null)

?

以上的代碼是比較難維護的。

我們可以讓所有的異步方法執行完畢后出來一個通知。

?

var counter = N; function success(){counter--;if(counter === 0){alert('done');} }async1(success); async2(success); ... asyncN(success);

?

■ 什么是Promise和Deferred

deferred表示異步操作的結果,提供了一個顯示操作結果和狀態的接口,并提供了一個可以獲取該操作結果相關的promise實例。deferred是可以改變操作狀態的。

promise提供了一個用來和相關deferred交互的接口。

當創建一個deferred,相當于一個pending狀態;
當執行resolve方法,相當于一個resolved狀態。
當執行reject方法,相當于一個rejected狀態。

我們可以在創建deferred之后,定義回調函數,而回調函數在得到resolved和rejected的狀態提示后開始執行。異步方法不需要知道回調函數如何操作,只需要在得到resolved或rejected狀態后通知回調函數開始執行。

■ 基本用法

→ 創建deferred

var myFirstDeferred = $q.defer();

這里,對于myFirstDeferred這個deferred,狀態是pending,接下來,當異步方法執行成功,狀態變成resolved,當異步方法執行失敗,狀態變成rejected。

→ Resolve或Reject這個dererred

假設有這樣的一個異步方法:async(success, failure)

?

async(function(value){myFirstDeferred.resolve(value); }, function(errorReason){myFirstDeferred.reject(errorReason); })

?

在AngularJS中,$q的resolve和reject不依賴上下文,大致可以這樣寫:

async(myFirstDeferred.resolve, myFirstDeferred.reject);

→ 使用deferred中的promise

var myFirstPromise = myFirstDeferred.promise;myFirstPromise.then(function(data){}, function(error){})

?

deferred可以有多個promise.

?

var anotherDeferred = $q.defer();anotherDeferred.promise.then(function(data){},function(error){})//調用異步方法 async(anotherDeferred.resolve, anotherDeferred.reject);anotherDeferred.promise.then(function(data){}, function(error){})

?

以上,如果異步方法async成功執行,兩個success方法都會被調用。

→ 通常把異步方法包裹到一個函數中

?

function getData(){var deferred = $q.defer();async(deferred.resolve,deferred.reject);return deferred.promise; }//deferred的promise屬性記錄了達到resolved, reject狀態所需要執行的success和error方法 var dataPromise = getData(); dataPromise.then(function(data){console.log('success');}, function(error){console.log('error');})

?

如果只關注success回調函數該如何寫呢?

dataPromise.then(function(data){console.log('success');})

?

如果只關注error回調函數該如何寫呢?

dataPromise.then(null, function(error){console.log('error');})或dataPromise.catch(function(error){console.log('error'); })

?

如果不管回調成功或失敗都返回相同的結果呢?

var finalCallback = function(){console.log('不管回調成功或失敗都返回這個結果'); }dataPromise.then(finalCallback, finalCallback);或dataPromise.finally(finalCallback);

■ 值鏈式

假設有一個異步方法,使用deferred.resolve返回一個值。

function async(value){var deferred = $q.defer();var result = value / 2;deferred.resolve(result);return deferred.promise; }

?

既然返回的是promise,我們就可以不斷then, then下去的。

var promise = async(8).then(function(x){return x+1;}).then(function(x){return x*2;})promise.then(function(x){console.log(x); })

以上,resolve出的值成為每一個鏈式的實參。

■ Promise鏈式

?

function async1(value){var deferred = $q.defer();var result = value * 2;deferred.resolve(result);return deferred.promise; }function async2(value){var deferred = $q.defer();var result = value + 1;deferred.resolve(result);return deferred.promise; }var promise = async1(10).then(function(x){return async2(x);})promise.then(function(x){console.log(x); })

?

當然一種更易讀的寫法是:

function logValue(value){console.log(value); }async1(10).then(async2).then(logValue);

?

async1方法的返回值成為then方法中的success方法中的實參。

如果從捕獲異常的角度,還可以這樣寫:

async1().then(async2).then(async3).catch(handleReject).finally(freeResources);

?

■ $q.reject(reason)?? ?

使用該方法能夠讓deferred呈現error狀態,并給出一個出現error的理由。

var promise = async().then(function(value){if(true){return value;} else {return $q.reject('value is not satisfied');} })

?

■ $q.when(value)

返回一個promise并帶上值。

function getDataFromBackend(query){var data = searchInCache(query);if(data){return $q.when(data);} else {reutrn makeAasyncBackendCall(query);} }

?

■ $q.all(promisesArr)

等待所有promise執行完成。

var allPromise = $q.all([async1(),async2(),...asyncN(); ])allProise.then(function(values){var value1 = values[0],value2 = values[1],...valueN = values[N];console.log('all done'); })

?

轉載于:https://www.cnblogs.com/darrenji/p/5184733.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Javacript和AngularJS中的Promises的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 香蕉视频在线观看黄 | 日韩大片免费观看视频播放 | 日本黄色的视频 | 网站免费视频www | 精品视频无码一区二区三区 | 中文字幕 国产精品 | 成人熟女一区二区 | 91精品婷婷国产综合久久竹菊 | 免费看的一级片 | 黄色一区二区三区四区 | 亚洲黄在线 | 国产精品视频亚洲 | 一区二区三区四区免费 | 电影寂寞少女免费观看 | 亚洲国产清纯 | 欧美午夜不卡 | 久久99久久久久 | 精品无码久久久久久久久久 | 狂野欧美性猛交blacked | 在线视频国产一区 | 欧美黄色一级大片 | 永久免费在线看片 | 男女激情大尺度做爰视频 | 麻豆久久久久久 | 亚洲专区在线 | 狠狠91| 国产精品久久久久久白浆 | 国产精品www | 国产精品一区在线 | 国产免费91| 国产免费一区二区视频 | 有码中文| 国产日韩精品久久 | 男人天堂五月天 | 亚洲福利视频网 | 麻豆传媒在线观看视频 | 青青草视频网站 | 欧美少妇xxxxx | 国产乱人乱精一区二视频国产精品 | 欧美肥妇bwbwbwbxx| h无码动漫在线观看 | 成人av激情 | 久久婷婷影视 | jzz在线观看 | 99久久精品免费看国产 | 久久久久久久影院 | 国产激情小视频 | 中文字幕永久视频 | www成人在线 | av站 | 91麻豆成人精品国产 | 日本久久一级片 | 久久综合激的五月天 | 最好看的2019中文大全在线观看 | 国产乱子一区二区 | 日日精 | www.天堂av.com | 国久久 | 黄a免费网络| 欧美精品久久久久久 | 中文字幕日韩精品一区 | 禁漫天堂免费网站 | 精品人妻互换一区二区三区 | 中文字幕在线观看视频一区 | 91精品国产91久久久久久吃药 | 在线看av网址 | 免费在线观看视频a | 91久久综合精品国产丝袜蜜芽 | 日日夜夜狠狠爱 | 任你躁av一区二区三区 | 亚洲一二三区在线观看 | 国产免费aa | 青青青免费视频观看在线 | 国产69xx| 毛片h | 看黄色的网址 | 健身教练巨大粗爽gay视频 | 91精品国 | 日韩欧洲亚洲 | 午夜爽爽视频 | 亚洲视频中文字幕在线观看 | 成人毛片18女人毛片免费 | 亚洲人精品午夜射精日韩 | 久久久精品中文字幕麻豆发布 | 欧亚一区二区 | 欧美日韩中文 | www日日日| 一级特黄妇女高潮2 | 国产不卡av在线 | 黄色av电影在线 | 伊人日日夜夜 | 夜夜爽www| 国产区一区二区三区 | 国产精品福利导航 | 精品视频免费在线 | 精品久久一 | 自拍偷拍校园春色 | 免费a大片 | 国产日韩欧美在线观看视频 |