日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: jizz日本免费 | 日日爱夜夜操 | 生活片毛片 | 亚洲一区二区三区久久 | 欧美亚洲综合一区 | 手机成人在线视频 | 伊人久久综合影院 | 操碰91 | 欧美久久久久 | 久久精品人人爽 | 国产精品精品国产 | av一二三| 91精品国产一区二区三区蜜臀 | 一区二区三区不卡在线 | 你懂的亚洲 | 国产精品成人99一区无码 | 久久久wwww | 男人影院在线观看 | 国产成人无码精品久久二区三 | 亚洲一区电影在线观看 | 一色综合 | 久久男人的天堂 | 国产日韩欧美视频在线观看 | 天天干免费视频 | 无码人妻丰满熟妇区毛片18 | 国产第一页屁屁影院 | 国产精品自产拍高潮在线观看 | 猎艳山村丰满少妇 | 日本视频h | 成人午夜在线播放 | 日韩一区二区影视 | 4438x全国最大成人 | 麻豆精品在线播放 | 国产一区二区三区影视 | 高hnp视频 | 国产一区精品在线 | 日日操夜夜操天天操 | 久久久久99精品成人片直播 | 欧美一区三区三区高中清蜜桃 | 污污免费观看 | 激情五月开心婷婷 | 7777精品久久久久久 | 国产女同视频 | 99色婷婷| 中文字幕在线免费看 | 日本免费在线视频观看 | 毛片aaaaaa| 黄色网页免费在线观看 | 中文字幕一区二区三区在线不卡 | 这里只有久久精品 | 亚洲欧美成人综合 | 伊人精品综合 | 午夜国产 | 一级黄色片国产 | 亚洲AV无码成人精品一区 | av片网站 | 成人黄色在线播放 | 久久国产精品系列 | 亚洲啪啪免费视频 | 苏晴忘穿内裤坐公交车被揉到视频 | 少妇高潮一区二区三区99欧美 | 99久热在线精品996热是什么 | 精品66| 国产网站av| 日韩a级在线观看 | 成人69视频 | 日韩 国产 欧美 | 亚洲精品免费在线观看 | 女人av在线 | 亚洲第一免费播放区 | 女人天堂网 | 午夜色图| 国产欧美精品一区二区色综合朱莉 | 精品免费观看 | 久久久av网站| 欧美做爰猛烈床戏大尺度 | 久久性生活 | 国产精品88av| 日韩一级片中文字幕 | 国产乡下妇女做爰视频 | 91丨九色 | 久久午夜鲁丝片 | 天堂av一区| 99精品欧美一区二区三区综合在线 | 伊人网欧美 | 性视频网 | 贝利弗山的秘密在线观看 | 91麻豆国产在线 | 午夜操操 | 成人午夜免费观看 | 亚洲欧美变态另类丝袜第一区 | 怡春院欧美 | 少妇熟女一区 | 97一区二区三区 | 久久天堂| 五月婷婷激情 | 日韩欧美在线观看一区 | 亚洲av成人一区二区国产精品 | 国产精品日日摸夜夜爽 |