久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

總結一些Promise常用的用法

2021-03-17    分類: 網站建設

Node的產生,大大推動了Javascript這門語言在服務端的發展,使得前端人員可以以很低的門檻轉向后端開發。

當然,這并不代表迸發成了全棧。全棧的技能很集中,絕不僅僅是前端會寫一些HTML和一些交互,后臺熟悉數據庫的增刪查改。

想必接觸過Node的人都知道,Node是以異步(Async)回調著稱的,其異步性提高了程序的執行效率,但同時也減少了程序的可讀性。如果我們有幾個異步操作,并且后一個操作需要前一個操作返回的數據才能執行,這樣按照Node的一般執行規律,要實現有序的異步操作,通常是一層加一層嵌套下去。

為了解決這個問題,ES6提出了Promise的實現。

含義

Promise 對象用于一個異步操作的最終完成(或失敗)及其結果值的表示。簡單點說,它就是用于處理異步操作的,異步處理成功了就執行成功的操作,異步處理失敗了就捕獲錯誤或者停止后續操作。

它的一般表示形式為:

new Promise(
  /* executor */
  function(resolve, reject) {
    if (/* success */) {
      // ...執行代碼
      resolve();
    } else { /* fail */
      // ...執行代碼
      reject();
    }
  }
);

其中,Promise中的參數executor是一個執行器函數,它有兩個參數resolvereject。它內部通常有一些異步操作,如果異步操作成功,則可以調用resolve()來將該實例的狀態置為fulfilled,即已完成的,如果一旦失敗,可以調用reject()來將該實例的狀態置為rejected,即失敗的。

我們可以把Promise對象看成是一條工廠的流水線,對于流水線來說,從它的工作職能上看,它只有三種狀態,一個是初始狀態(剛開機的時候),一個是加工產品成功,一個是加工產品失?。ǔ霈F了某些故障)。同樣對于Promise對象來說,它也有三種狀態:

  1. pending
    初始狀態,也稱為未定狀態,就是初始化Promise時,調用executor執行器函數后的狀態。
  2. fulfilled
    完成狀態,意味著異步操作成功。
  3. rejected
    失敗狀態,意味著異步操作失敗。

它只有兩種狀態可以轉化,即

  • 操作成功
    pending -> fulfilled
  • 操作失敗
    pending -> rejected

并且這個狀態轉化是單向的,不可逆轉,已經確定的狀態(fulfilled/rejected)無法轉回初始狀態(pending)。

方法

Promise.prototype.then()

Promise對象含有then方法,then()調用后返回一個Promise對象,意味著實例化后的Promise對象可以進行鏈式調用,而且這個then()方法可以接收兩個函數,一個是處理成功后的函數,一個是處理錯誤結果的函數。

如下:

var promise1 = new Promise(function(resolve, reject) {
 // 2秒后置為接收狀態
 setTimeout(function() {
  resolve('success');
 }, 2000);
});

promise1.then(function(data) {
 console.log(data); // success
}, function(err) {
 console.log(err); // 不執行
}).then(function(data) {
 // 上一步的then()方法沒有返回值
 console.log('鏈式調用:' + data); // 鏈式調用:undefined 
}).then(function(data) {
 // ....
});

在這里我們主要關注promise1.then()方法調用后返回的Promise對象的狀態,是pending還是fulfilled,或者是rejected?

返回的這個Promise對象的狀態主要是根據promise1.then()方法返回的值,大致分為以下幾種情況:

  1. 如果then()方法中返回了一個參數值,那么返回的Promise將會變成接收狀態。
  2. 如果then()方法中拋出了一個異常,那么返回的Promise將會變成拒絕狀態。
  3. 如果then()方法調用resolve()方法,那么返回的Promise將會變成接收狀態。
  4. 如果then()方法調用reject()方法,那么返回的Promise將會變成拒絕狀態。
  5. 如果then()方法返回了一個未知狀態(pending)的Promise新實例,那么返回的新Promise就是未知狀態。
  6. 如果then()方法沒有明確指定的resolve(data)/reject(data)/return data時,那么返回的新Promise就是接收狀態,可以一層一層地往下傳遞。

轉換實例如下:

var promise2 = new Promise(function(resolve, reject) {
 // 2秒后置為接收狀態
 setTimeout(function() {
  resolve('success');
 }, 2000);
});

promise2
 .then(function(data) {
  // 上一個then()調用了resolve,置為fulfilled態
  console.log('第一個then');
  console.log(data);
  return '2';
 })
 .then(function(data) {
  // 此時這里的狀態也是fulfilled, 因為上一步返回了2
  console.log('第二個then');
  console.log(data); // 2

  return new Promise(function(resolve, reject) {
   reject('把狀態置為rejected error'); // 返回一個rejected的Promise實例
  });
 }, function(err) {
  // error
 })
 .then(function(data) {
  /* 這里不運行 */
  console.log('第三個then');
  console.log(data);
  // ....
 }, function(err) {
  // error回調
  // 此時這里的狀態也是fulfilled, 因為上一步使用了reject()來返回值
  console.log('出錯:' + err); // 出錯:把狀態置為rejected error
 })
 .then(function(data) {
  // 沒有明確指定返回值,默認返回fulfilled
  console.log('這里是fulfilled態');
});

Promise.prototype.catch()

catch()方法和then()方法一樣,都會返回一個新的Promise對象,它主要用于捕獲異步操作時出現的異常。因此,我們通常省略then()方法的第二個參數,把錯誤處理控制權轉交給其后面的catch()函數,如下:

var promise3 = new Promise(function(resolve, reject) {
 setTimeout(function() {
  reject('reject');
 }, 2000);
});

promise3.then(function(data) {
 console.log('這里是fulfilled狀態'); // 這里不會觸發
 // ...
}).catch(function(err) {
 // 最后的catch()方法可以捕獲在這一條Promise鏈上的異常
 console.log('出錯:' + err); // 出錯:reject
});

Promise.all()

Promise.all()接收一個參數,它必須是可以迭代的,比如數組

它通常用來處理一些并發的異步操作,即它們的結果互不干擾,但是又需要異步執行。它最終只有兩種狀態:成功或者失敗

它的狀態受參數內各個值的狀態影響,即里面狀態全部為fulfilled時,它才會變成fulfilled,否則變成rejected

成功調用后返回一個數組,數組的值是有序的,即按照傳入參數的數組的值操作后返回的結果。如下:

// 置為fulfilled狀態的情況
var arr = [1, 2, 3];
var promises = arr.map(function(e) {
 return new Promise(function(resolve, reject) {
  resolve(e * 5);
 });
});

Promise.all(promises).then(function(data) {
  // 有序輸出
 console.log(data); // [5, 10, 15]
 console.log(arr); // [1, 2, 3]
});
// 置為rejected狀態的情況
var arr = [1, 2, 3];
var promises2 = arr.map(function(e) {
 return new Promise(function(resolve, reject) {
  if (e === 3) {
   reject('rejected');
  }
  resolve(e * 5);
 });
});

Promise.all(promises2).then(function(data) {
 // 這里不會執行
 console.log(data);
 console.log(arr);
}).catch(function(err) {
 console.log(err); // rejected
});

Promise.race()

Promise.race()和Promise.all()類似,都接收一個可以迭代的參數,但是不同之處是Promise.race()的狀態變化不是全部受參數內的狀態影響,一旦參數內有一個值的狀態發生的改變,那么該Promise的狀態就是改變的狀態。就跟race單詞的字面意思一樣,誰跑的快誰贏。如下:

var p1 = new Promise(function(resolve, reject) {
 setTimeout(resolve, 300, 'p1 doned');
});

var p2 = new Promise(function(resolve, reject) {
 setTimeout(resolve, 50, 'p2 doned');
});

var p3 = new Promise(function(resolve, reject) {
 setTimeout(reject, 100, 'p3 rejected');
});

Promise.race([p1, p2, p3]).then(function(data) {
 // 顯然p2更快,所以狀態變成了fulfilled
 // 如果p3更快,那么狀態就會變成rejected
 console.log(data); // p2 doned
}).catch(function(err) {
 console.log(err); // 不執行
});

Promise.resolve()

Promise.resolve()接受一個參數值,可以是普通的值,具有then()方法的對象Promise實例。正常情況下,它返回一個Promise對象,狀態為fulfilled。但是,當解析時發生錯誤時,返回的Promise對象將會置為rejected態。如下:

// 參數為普通值
var p4 = Promise.resolve(5);
p4.then(function(data) {
 console.log(data); // 5
});


// 參數為含有then()方法的對象
var obj = {
 then: function() {
  console.log('obj 里面的then()方法');
 }
};

var p5 = Promise.resolve(obj);
p5.then(function(data) {
 // 這里的值時obj方法里面返回的值
 console.log(data); // obj 里面的then()方法
});


// 參數為Promise實例
var p6 = Promise.resolve(7);
var p7 = Promise.resolve(p6);

p7.then(function(data) {
 // 這里的值時Promise實例返回的值
 console.log(data); // 7
});

// 參數為Promise實例,但參數是rejected態
var p8 = Promise.reject(8);
var p9 = Promise.resolve(p8);

p9.then(function(data) {
 // 這里的值時Promise實例返回的值
 console.log('fulfilled:'+ data); // 不執行
}).catch(function(err) {
 console.log('rejected:' + err); // rejected: 8
});

Promise.reject()

Promise.reject()和Promise.resolve()正好相反,它接收一個參數值reason,即發生異常的原因。此時返回的Promise對象將會置為rejected態。如下:

var p10 = Promise.reject('手動拒絕');
p10.then(function(data) {
 console.log(data); // 這里不會執行,因為是rejected態
}).catch(function(err) {
 console.log(err); // 手動拒絕
}).then(function(data) {
 // 不受上一級影響
 console.log('狀態:fulfilled'); // 狀態:fulfilled
});

總之,除非Promise.then()方法內部拋出異?;蛘呤敲鞔_置為rejected態,否則它返回的Promise的狀態都是fulfilled態,即完成態,并且它的狀態不受它的上一級的狀態的影響。

總結

大概常用的方法就寫那么多,剩下的看自己實際需要再去了解。

解決Node回調地獄的不止有

Promise,還有總結一些Promise常用的用法
當前地址:http://www.js-pz168.com/news29/105329.html

成都網站建設公司_創新互聯,為您提供網站營銷用戶體驗、定制網站、建站公司、微信公眾號網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
懂色av一区二区夜夜嗨| 免费国产在线精品一区二区三区| 精品国产乱码久久久久久郑州公司 | 一本久久a久久精品亚洲| 欧美二区三区91| 国产精品久久毛片a| 青青草国产精品97视觉盛宴| 99久久精品一区二区| 日韩精品第一页| 欧美一级理论片| 亚洲精品乱码久久久久久久久 | 欧美性猛片aaaaaaa做受| 久久精品一区二区| 偷拍亚洲欧洲综合| 7777精品伊久久久大香线蕉语言 | 欧美亚洲一区二区在线观看| 国产亚洲欧美激情| 美腿丝袜在线亚洲一区| caoporn国产精品免费公开| 亚洲一二三四久久| 91嫩草在线| 热久久国产精品| 91丨porny丨首页| 正在播放亚洲| 国产亚洲短视频| 免费看欧美女人艹b| 666精品在线| 欧美综合一区二区| 国产精品久久毛片a| 国产一区二区三区在线观看免费视频| 黄色99视频| 91精品国产综合久久婷婷香蕉| 亚洲精品美国一| 9人人澡人人爽人人精品| 在线国产伦理一区| 久久久久国产精品麻豆ai换脸| 日韩电影免费在线观看网站| 国产91免费视频| 777欧美精品| 亚洲一区二区三区四区五区中文 | 欧美午夜精品一区| 亚洲色欲色欲www在线观看| 高清成人在线观看| 自拍偷拍一区二区三区| 国产精品污污网站在线观看| 国产一区二区三区免费在线观看 | 日韩美女久久久| jiyouzz国产精品久久| 色综合久久天天综合网| 国产精品毛片大码女人| 国产成人夜色高潮福利影视| www精品美女久久久tv| 99re这里都是精品| 一级特黄录像免费播放全99| 国产视频一区在线观看| 国产在线精品一区二区三区不卡| 日本精品国语自产拍在线观看| 久久亚洲影视婷婷| 激情综合网av| 在线免费观看成人网| 日韩一区在线免费观看| 99久久婷婷国产综合精品| 欧美视频在线观看一区| 亚洲一区二区欧美激情| 国产一区二区免费在线观看| 日韩欧美在线网站| 久久国产福利国产秒拍| 日本在线播放不卡| 中文字幕欧美一区| 91精品国产一区二区三区动漫| 8v天堂国产在线一区二区| 日本在线播放一区二区三区| 欧美一区二区三区四区夜夜大片| 国产人久久人人人人爽| 成人av集中营| 欧美一区二区三区免费在线看 | 久久婷婷开心| 日本一区二区动态图| 99久久综合99久久综合网站| 这里只有精品99re| 久久99国产精品久久99果冻传媒| 精品美女被调教视频大全网站| 秋霞电影网一区二区| 日韩国产精品一区二区| 亚洲天堂中文字幕| 高清日韩一区| 国产日韩成人精品| 91亚洲国产成人精品一区二区三 | 国产乱码精品1区2区3区| 91福利视频网站| 日韩av一区二区在线影视| 午夜精品一区二区三区四区| 亚洲精品视频自拍| 久久久久无码国产精品一区| 国产精品久久久久影院| 国产精品果冻传媒潘| 国产日韩成人精品| 99re在线观看| 国产女人水真多18毛片18精品视频 | 国产福利一区二区| 777午夜精品视频在线播放| 国产一区二区美女| 欧美裸体一区二区三区| 国产伦理精品不卡| 欧美精品自拍偷拍| 国产电影一区二区三区| 91精品国产91久久综合桃花| 国产精品一二三区| 日韩一区二区电影| 成人激情av网| 久久综合精品国产一区二区三区| 成人sese在线| 久久蜜桃av一区二区天堂| 91免费精品国自产拍在线不卡| 国产亚洲va综合人人澡精品| 国产不卡一区二区三区在线观看| 亚洲国产高清aⅴ视频| 国产主播一区二区三区四区| 亚洲人午夜精品天堂一二香蕉| 欧美日韩一区二区视频在线观看| 亚洲自拍偷拍欧美| 色天天综合色天天久久| 紧缚捆绑精品一区二区| 日韩视频123| 1卡2卡3卡精品视频| 国产精品久久久久久久久果冻传媒| 精品999在线观看| 一区二区三区日韩在线观看| 亚洲一区影院| 精品一区二区三区欧美| 欧美一级精品在线| 97se亚洲综合在线| 亚洲天天做日日做天天谢日日欢| 日本一区视频在线观看免费| 日韩av电影免费观看高清完整版 | 精品亚洲欧美一区| 日韩久久久久久| 99视频免费观看蜜桃视频| 一区在线观看视频| 亚洲电影免费| 久久国产生活片100| 日韩一级免费观看| 成人蜜桃视频| 亚洲自拍欧美精品| 欧美三级韩国三级日本三斤 | 欧美一区二区福利在线| 91偷拍与自偷拍精品| 亚洲天堂久久久久久久| 一区不卡字幕| 国产福利精品导航| 国产欧美日本一区视频| 青青草成人激情在线| 六月丁香综合在线视频| 精品美女在线播放| 裸模一区二区三区免费| 日本视频在线一区| 精品日韩在线一区| 久久国产一区| 久久精品理论片| 久久综合色一综合色88| 蜜桃成人在线| 久久99精品国产麻豆婷婷洗澡| 精品国产91九色蝌蚪| 美媛馆国产精品一区二区| 另类的小说在线视频另类成人小视频在线| 日韩亚洲欧美综合| 黄色一区三区| 久久精品国产精品亚洲红杏| 久久久久免费观看| 少妇免费毛片久久久久久久久| 国产一区二区三区免费看| 国产精品嫩草久久久久| 一本色道久久综合亚洲91 | 欧美一级日韩免费不卡| 久久精品国产理论片免费| 美女一区二区三区| 国产日韩一级二级三级| 一本久久a久久精品vr综合 | 日本不卡在线视频| 久久久亚洲精品一区二区三区| 日本午夜精品一区二区三区| 国产大陆精品国产| 日韩伦理av电影| 欧美精品三级日韩久久| 精品国产乱码久久久久久88av | 最近日韩中文字幕| 欧美午夜精品理论片a级按摩| 91gao视频| 蜜桃传媒麻豆第一区在线观看| 国产欧美一区二区三区网站| 色综合天天综合狠狠| 91超碰rencao97精品| 麻豆精品视频在线| 国产精品毛片a∨一区二区三区| 欧洲激情一区二区| 国产在线一区二区三区欧美| 国产一区二三区| 夜夜精品视频一区二区| 精品久久人人做人人爰| 自拍视频一区二区三区|