Promise函數(shù)介紹和用法

Promise函數(shù)(異步請求操作可用)


Promise用法

Promise其實是一個構(gòu)造函數(shù) !

使用方法如下:

new Promise(function(resolve,reject){});

在實例化Promise時需要傳入一個函數(shù)executor作為參數(shù),并且在Promise構(gòu)造函數(shù)執(zhí)行時同步執(zhí)行,這里的executor指function(resolve,reject){}

舉例:

var p = new Promise(function(resolve,reject){                            console.log('執(zhí)行操作1');        
});

控制臺將會輸出 執(zhí)行操作1, 說明在實例化過程中,作為參數(shù)的executor函數(shù)也會執(zhí)行。

executor函數(shù)還有兩個參數(shù)resolve和reject,這兩個參數(shù)也是函數(shù),在executor執(zhí)行時被調(diào)用 。

resolve和reject的具體用法

Promise的幾種狀態(tài):

  • pending: 初始狀態(tài),成功或失敗狀態(tài)。
  • fulfilled: 意味著操作成功完成。(resolve)
  • rejected: 意味著操作失敗。

調(diào)用resolve則表示成功,調(diào)用rejected表示失敗。

當(dāng)Promise狀態(tài)為fullfilled狀態(tài)時執(zhí)行then方法里的操作 。

then方法里面有兩個參數(shù)onfulfilled(Promise為fulfilled狀態(tài)時執(zhí)行) 和onrejected(Promise為rejected狀態(tài)時執(zhí)行),步驟如下:

  • 實例化Promise new Promise(function(resolve,reject))

  • 用Promise的實例調(diào)用then方法

舉例:

var p = new Promise(function (resolve, reject) {                  console.log('執(zhí)行操作1');               
       resolve('success');  // 這里調(diào)用了resolve 即成功狀態(tài)
 });       
 p.then(function (data) { // 這里的函數(shù)是resolve,參數(shù)書上面?zhèn)魅氲?success'          
    console.log(data); // 控制臺打印 success           
    console.log('這是成功操作');  // 控制臺打印 這是成功操作     
 });

上述代碼執(zhí)行后控制臺會打?。?/p>

  • 執(zhí)行操作1

  • success

  • 這是成功操作

可以理解為then函數(shù)的參數(shù)就是我們的回調(diào)函數(shù)(resolve函數(shù)或者reject函數(shù))

一般來說then的參數(shù)也是兩個。

完整例子:

var p = new Promise(function (resolve, reject) {
    var flag = false;
    if(flag){ //這里的flag可以替換成后臺獲取數(shù)據(jù)成功與否
        resolve('SUCCESS');
      }else{
        reject('FAILUER');
     }
   });
   p.then(function(data){//狀態(tài)為fulfilled時執(zhí)行
       console.log(data);
       console.log('這是成功操作');
   },function(reason){ //狀態(tài)為rejected時執(zhí)行
       console.log(reason);
       console.log('這是失敗的操作');
   });

上述代碼,由于flag是false,所以會走reject函數(shù)。

由于Promise對象上有catch函數(shù), 其實跟then方法中的第二個參數(shù)一樣,就是在Promise狀態(tài)為rejected時執(zhí)行,then方法捕捉到Promise的狀態(tài)為rejected,就執(zhí)行catch方法里面的操作 ,最終例子:

var p = new Promise(function (resolve, reject) {
    var flag = false;
    if(flag){ //這里的flag可以替換成后臺獲取數(shù)據(jù)成功與否
        resolve('SUCCESS');
      }else{
        reject('FAILUER');
     }
   });
   p.then(function(data){//狀態(tài)為fulfilled時執(zhí)行
       console.log(data);
       console.log('這是成功操作');
   }).catch(function(reason){ //狀態(tài)為rejected時執(zhí)行
       console.log(reason);
       console.log('這是失敗的操作');
   });
總結(jié)

promise主要是為了解決js中多個異步回調(diào)難以維護和控制的問題 。

推廣:


function func(resolve,reject) {
let p = new Promise(function (resolve, reject) {
    // 一些比較耗時異步操作
    if(操作完成標(biāo)識) {
        resolve();
    }
});
p.then(function (data) {
    // do something
    }).catch( function () {
       // do something
    });
});
}

實現(xiàn)(Angular8中的http請求示例(已經(jīng)過測試)):

public getLists(callback: any): void {
    console.log(typeof callback);
    if (typeof callback !== 'function') {
      return;
    }
    const p = new Promise((resolve, reject) => {
      this.http.get<List[]>(this.listUrl, httpOptions).subscribe(response => {
          console.log(response);
          resolve(response);
        });
    }).then(result => {
      callback(result);
    });
  }

在service中按上述代碼封裝,外部調(diào)用時就可以傳入回調(diào)函數(shù)進行自己的邏輯處理,也不會影響this的作用域。

外部調(diào)用示例:

@Component({
  selector: 'app-study-list',
  templateUrl: './study-list.component.html',
  styleUrls: ['./study-list.component.css']
})
export class StudyListComponent implements OnInit, OnDestroy {
  // 列表
  list: List[];

  constructor(private listService: StudyService) {}

  ngOnInit() {
     // 傳入自定義函數(shù)即可,不會影響this的作用域
    this.listService.getLists((value: List[]) => {
      this.list = value;
    });
    console.log('list組建被創(chuàng)建');
  }

  ngOnDestroy(): void {
    // throw new Error('Method not implemented.');
    console.log('list組建被銷毀');
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,844評論 1 56
  • 含義 Promise是異步編程的一種解決方案,用于一個異步操作的最終完成(或失敗)及其結(jié)果值的表示,比傳統(tǒng)的回調(diào)函...
    nimw閱讀 27,413評論 0 4
  • Promise 的含義 一句話概括一下promise的作用:可以將異步操作以同步操作的流程表達出來,避免了層層嵌套...
    雪萌萌萌閱讀 5,667評論 0 7
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便。 async函數(shù)對 ...
    Xyaleo閱讀 1,175評論 0 4
  • 前言 本文旨在簡單講解一下javascript中的Promise對象的概念,特性與簡單的使用方法。并在文末會附上一...
    _暮雨清秋_閱讀 2,325評論 0 3

友情鏈接更多精彩內(nèi)容