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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Promise用法总结

發(fā)布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Promise用法总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. Promise的狀態(tài) Promise對象有三個狀態(tài): 1. 進行中(pending) 2. 成功(resolved) 3. 失敗(rejected) 2. 生成一個Promise對象 1. 構(gòu)造函數(shù) new Promise(function(resolve,reject){}); resolve和reject函數(shù)是瀏覽器內(nèi)部實現(xiàn)的,直接調(diào)用即可。 2. Promise.resolve Promise.resolve()直接返回一個resolve狀態(tài)的Promise對象 Promise.resolve可以用來生成一個then鏈 3. Promise.reject Promise.reject()直接返回一個reject狀態(tài)的Promise對象 3. Promise的then的用法
Promise的then永遠返回一個新的Promise,Promise的catch是then(null,rejection)的語法糖,catch中也會返回一個新的Promise。 建議在Promise的then永遠return或throw,不要只是執(zhí)行一個函數(shù)。
例如: var aPromise = new Promise(function (resolve) {resolve(100); }); var thenPromise = aPromise.then(function (value) {console.log(value); }); var catchPromise = thenPromise.catch(function (error) {console.error(error); }); console.log(aPromise !== thenPromise); // => true console.log(thenPromise !== catchPromise);// => true === 是嚴格相等比較運算符,我們可以看出這三個對象都是互不相同的,這也就證明了 then 和 catch 都返回了和調(diào)用者不同的promise對象。
1. Promise的then內(nèi)部可以做三種事情: (1). return 另一個promise (2). return 一個同步值(或者undefined) 因為javascript函數(shù)無返回值時候,默認返回undefined,所以只是執(zhí)行一個函數(shù),不return,默認就是返回undefined。 返回一個同步值在Promise中會將同步代碼包裹為promise,得到的還是一個promsie。返回一個同步值是有用處的,例如, 一個異步值在內(nèi)存中做了緩存,可以直接從內(nèi)存中拿到該值,直接返回,不必再調(diào)用異步接口。 getUserByName('xxx').then(function(user){if(imMemoryCache[user.id]){return inMemoryCache[user.id];}return getUserAccountById(user.id); }).then(function(userAccount){}); (3). throw 一個同步異常 2. Promise的一些寫法 new Promise(function(resolve,reject){resolve(syncValue); }).then(/*...*/)//可以寫成 Promise.resolve(syncValue).then(/*...*/)//一個錯誤也可以寫成 Promise.reject(new Error('...')) 這樣無論成功或失敗都可以后面的then和catch中捕獲和繼續(xù)操作 3. Promise的then中只能傳遞函數(shù),如果為其他類型,例如另一Promise,會被解釋為null,此時Promsie的值傳遞會穿透 例如: Promise.resolve('foo').then(Promise.resolve('bar')).then(function(result){console.log(result); }); //會被解釋為: Promise.resolve('foo').then(null).then(function(result){console.log(result); }); 第一個resolve的值會穿透到then,打印出foo。 4. then的四種寫法的區(qū)別 // 寫法一 f1().then(function () {return f2(); });// 寫法二 f1().then(function () {f2(); });// 寫法三 f1().then(f2());// 寫法四 f1().then(f2); 1. 寫法1和4完全等價,f1值能傳遞到f2,f2的返回值也能繼續(xù)向后面的then傳遞 2. 寫法2相當于默認return undefined,無法向后面的then傳遞值 3. 寫法3能夠向后面?zhèn)鬟ff2的值,沒有更深刻的解釋(有懂的朋友請評論告知)
4. Promise的調(diào)用方法
每個then返回一個新的promise調(diào)用,這種寫法被稱為composing promises。 promise1.then(function(){return promise2; }).then(function(){return promise3; }).then(function(){return promise4; }).catch(function(err){console.log(err); }); 5. Promise的并行執(zhí)行
由于promise一旦被創(chuàng)建,就會立即執(zhí)行,所以拿到一個Promise數(shù)組時候,其中的promise必然全部開始執(zhí)行了。 因此要讓一系列promise順序執(zhí)行,只能將promise放在一個函數(shù)中,在要執(zhí)行的時候才去創(chuàng)建他,就是一個工廠 函數(shù),promiseFactory。promise并行執(zhí)行的代碼應(yīng)該如下: function executeSequentially(promiseFactories){var res = Promsie.resolve();promiseFactories.forEach(function(promiseFactory){res = res.then(promiseFactory);});return res; } //工廠函數(shù)只是簡單的創(chuàng)建一個promise function promiseFactory(){return createAPromise(); } 6. Promise捕獲錯誤 7. 實現(xiàn)一個Promise版本的ajax //原生版本 function Http(){}Http.prototype = {get:function(opts){return this.ajax(opts);},post:function(){return this.ajax(opts);},ajax:function(opts){return Promise(function(resolve,reject){var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('...');var {url,method,data,async,success,fail} = options;var sendBody = null;var qs = Object.keys(data).reduce(function(cur,pre,index){return pre + '&' + encodeURIComponent(cur) + '=' + encodeURIComponent(data[cur]);},'').slice(1);if(medthod == 'get'){url += '?' + qs;}else if(medhot == 'post'){xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');sendBody = qs || null;}xhr.onreadystatechange = function(){if(xhr.readystate == 4){if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){resolve(xhr,xhr.responseText);}}else{reject(xhr,xhr.responseText);}}xhr.open(method,url,async);xhr.send(sendBody);});} }//jquery版本 function Http(){}Http.prototype = {get:function(opts){return this.ajax(opts);},post:function(opts){return this.ajax(opts);},ajax:function(){return $.ajax(opts);} }

?

?

參考:https://juejin.im/entry/596f2ab2f265da6c25190f41 http://javascript.ruanyifeng.com/advanced/promise.html#toc2 https://www.kancloud.cn/kancloud/promises-book/44256

?

轉(zhuǎn)載于:https://www.cnblogs.com/mengff/p/9646392.html

總結(jié)

以上是生活随笔為你收集整理的Promise用法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产女教师bbwbbwbbw | 国产乱仑视频 | 国产麻豆午夜三级精品 | 伊人66 | 青青在线视频观看 | 久久久资源网 | 黄色免费视频网站 | 国产成人无码精品久久 | 97超碰在线播放 | 草莓巧克力香氛动漫的观看方法 | 国产不卡二区 | 久久精品国产亚洲av香蕉 | 国模无码国产精品视频 | 亚洲成人精品在线观看 | 在线观看av资源 | 青青国产精品 | 一品毛片 | 欧美综合社区 | 999久久久精品 | 成人免费性生活视频 | 欧美日韩国产网站 | 日韩美女一区二区三区 | 精品动漫一区二区三区在线观看 | 久久影视网 | 欧美黄色大全 | 1区2区视频 | 色噜噜狠狠一区二区三区 | 日韩人妻一区二区三区蜜桃视频 | 亚洲国产欧美日韩 | 亚洲天堂美女 | 黄色片在线免费观看 | 国产高清视频在线观看 | 求个黄色网址 | 人妻在客厅被c的呻吟 | 91手机在线| 亚洲精品日韩欧美 | 亚洲天堂一区二区在线观看 | 18无套直看片红桃 | 国内一区二区 | 久久瑟瑟 | 中文字幕第28页 | 黄色小视频大全 | 亚洲精品在线播放视频 | 成人无码一区二区三区 | 99热这里只有精品1 亚洲人交配视频 | 中文字幕在线高清 | 国产黄色在线 | 国产成人激情视频 | 日韩一区二区在线观看视频 | 久久在线精品视频 | 麻豆av在线播放 | 欧美老女人性生活视频 | 欧美美女一区二区三区 | 成人在线天堂 | 天堂中文资源在线 | 欧美激情国产精品 | 国产精品高潮呻吟视频 | 夜夜草天天草 | 8ppav| 婷婷国产在线 | 在线播放的av | 男人看片网站 | 国产吃瓜黑料一区二区 | 国产91在线视频 | 久久乐国产精品 | 亚洲AV无码乱码国产精品色欲 | 国产精品久久久久久无人区 | 变态 另类 国产 亚洲 | 成人污在线观看 | 色婷婷六月 | 在线播放少妇奶水过盛 | 国产成人愉拍精品久久 | 欧美日韩不卡合集视频 | 少妇免费直播 | 波多野吉衣av无码 | av在线网址大全 | 91成人破解版 | 无码粉嫩虎白一线天在线观看 | 献给魔王伊伏洛基亚吧动漫在线观看 | 久久青青操 | 久久久久无码国产精品一区 | 成年人黄色免费视频 | 中文字幕一区二区人妻 | 中文字幕在线播放一区 | 成年人视频在线免费看 | 国产成人高清 | av日日夜夜| 911亚洲精品| 香蕉黄色网 | 亚洲三级在线免费观看 | 欧美肥老妇 | 亚洲日本网站 | 日韩精品视频网站 | 亚洲欧洲一区二区 | 欧美一区二区视频在线 | 国产精品亚洲综合 | 成人网页在线观看 | 人人干干人人 | 久草资源在线观看 |