国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Promise 詳解

derek_334892 / 2299人閱讀

摘要:是異步編程的一種解決方案,比傳統的解決方案回調函數和事件更合理和更強大。規定,對象是一個構造函數,用來生成實例。在同步調用下,回調函數一般是最后執行的。

1、Promise 的含義
初識Promise,要從多方面去理解,可以直接百度Promise,只看別人博客的前面的含義介紹,先不深入看別人的博客,基本可以了解到:

promise原意:諾言; 許諾; 承諾;預示。

Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。鏈接描述

Promises 是一種 JavaScript 中處理異步代碼的方法,其實 Promises 已經存在多年,但是直到 ES2015 (ES6)才被標準化和引入,現在它們已經在 ES2017(ES8) 中被 async(異步) 函數所取代和擴展,可見發展之快。鏈接描述

一個 Promise 就是一個對象,它代表了一個異步操作的最終完成或者失敗。鏈接描述

Promise對象用于異步操作,它表示一個尚未完成且預計在未來完成的異步操作。

ES6 規定,Promise對象是一個構造函數,用來生成Promise實例。

Async functions(異步函數) 使用 promises API 作為構建塊,因此理解 Promises 是必須的,即使在較新的代碼中,你可能會使用 async(異步) 函數而不是promises 。鏈接描述

2、同步、異步、回調函數相關概念

JavaScript的執行環境是單線程。所謂單線程,是指JS引擎中負責解釋和執行JavaScript代碼的線程只有一個,也就是一次只能完成一項任務,這個任務執行完后才能執行下一個,它會阻塞其他任務。這個任務可稱為主線程。但實際上還有其他線程,如事件觸發線程、ajax請求線程等。

同步模式,即上述所說的單線程模式,一次只能執行一個任務,函數調用后需等到函數執行結束,返回執行的結果,才能進行下一個任務。如果這個任務執行的時間較長,就會導致線程阻塞。

    /* 例2.1 */
    var x = true;
    while(x);
    console.log("don"t carry out");    //不會執行
    上面的例子即同步模式,其中的while是一個死循環,它會阻塞進程,因此第三句console不會執行。
    同步模式比較簡單,也較容易編寫。但問題也顯而易見,如果請求的時間較長,而阻塞了后面代碼的執行,
    體驗是很不好的。因此對于一些耗時的操作,異步模式則是更好的選擇。

異步模式,即與同步模式相反,可以一起執行多個任務,函數調用后不會立即返回執行的結果,如果任務A需要等待,可先執行任務B,等到任務A結果返回后再繼續回調。最常見的異步模式就數定時器了,我們來看看以下的例子。

    /* 例2.2 */
    setTimeout(function() {
        console.log("taskA, asynchronous");
    }, 0);
    console.log("taskB, synchronize");
    //while(true);

    -------ouput-------
    taskB, synchronize
    taskA, asynchronous
    我們可以看到,定時器延時的時間明明為0,但taskA還是晚于taskB執行。
    這是為什么呢?由于定時器是異步的,異步任務會在當前腳本的所有同步 任務執行完才會執行。
    如果同步代碼中含有死循環,即將上例的注釋去掉,那么這個異步任務就不會執行,因為同步任務阻塞了進程。

回調函數,提起異步,就不得不談談回調函數了。上例中,setTimeout里的function便是回調函數。可以簡單理解為:(執行完)回(來)調(用)的函數。

    **WikiPedia對于callback的定義。**
    In computer programming, a callback is a piece of executable code that is passed as 
    an argument to other code, which is expected to call back (execute) the argument 
    at some convenient time.
    可以看出,回調函數是一段可執行的代碼段,它以「參數」的形式傳遞給其他代碼,
    在其合適的時間執行這段(回調函數)的代碼。
    **WikiPedia還定義**
    The invocation may be immediate as in a synchronous callback, 
    or it might happen at a later time as in an asynchronous callback.
    也就是說,回調函數不僅可以用于異步調用,一般同步的場景也可以用回調。
    在同步調用下,回調函數一般是最后執行的。而異步調用下,可能一段時間后執行或不執行(未達到執行的條件)。
3、Promise 的特點和基本用法
promise對象有兩個特點:

對象的狀態不受外界影響,pending(進行中)、fulfiled(已完成)、rejected(已失敗)

一旦狀態改變,就不會再變,任何時候都可以得到這個結果,狀態改變只有兩種可能,稱為(resolved)

基本用法:
es6規定,Promise對象是一個構造函數,用來生成Promise實例。
擴展構造函數回顧:特殊方法,創建對象時初始化對象,為對象成員變量賦初始值,與new一起使用。
一個類可以有多個構造函數 ,可根據其參數個數的不同或參數類型的不同來區分它們 即構造函數的重載。
var promise = new promise(function(resove, reject){
  // ... some code
  if (/*異步成功*/){
    resove(value);
  } else{
    reject(error);。
  }
});
簡單例子1 
例子用到了箭頭函數,寫法很容易理解,可參考另一篇文章
    let p= new Promise((resolve, reject)=>{
        let a1="成功傳出去的對象";
        let a2="失敗傳出去的對象";
        var timer = setTimeout(function () {
                     console.log("after resolve");
                    resolve(a1);
                    reject(a2);
                    console.log("after error");
                }, 1000);
    });
    p.then(value=>{
        console.log(value);
    },error=>{
        console.log(".then的第二個參數");
        console.log(error)
    });
    p.catch(error=>{
        console.log(".catch");
        console.log(error);
    });
    

上面例子的輸出效果,出現的第一行是Promise{},
然后再次輸入p 按回車執行打印出來p是這樣Promise{}
然后點開看 可以看到控制臺提示promiseStatus :resolved 說明promise的狀態已經成為了resolved

上面例子把resolve(a1)去掉,結果如下:

4、解讀promise中唯一的參數、resolve參數、reject參數、then()、catch()方法的意義
參考上面例子1

let p = new Promise(參數1),創造一個實例時,接受一個函數作為參數1;

參數1,作為函數,也接受兩個參數分別是resolve和reject。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署。注意:這兩個函數的作用就是改變Promise對象的狀態,一個是成功,一個是失敗,一旦調用了其中一個,狀態就不可改變和逆轉;

Promise實例生成以后,可以用then方法分別指定resolved狀態和rejected狀態的回調函數,即使用p.then()來進一步的操作,注意:then()可以接受兩個參數,這兩個參數也是函數,第一個表示成功的操作,就是調用了resolve(a1)后會進入,第二個表示失敗的操作,就是調用了reject(a1)后會進入,但第二個可以省略;

p.catch和.then()第二個參數的效果是一樣,都會進入;

例子1的resolve(a1)和reject(a2)同時存在時,只有在前面的有用,可注釋第一個看失敗的效果;

例子中的resolve,reject只是個名字,其實可以隨便改,不建議改;

例子中p.then(value=>{console.log(value)},這里面的value也只是個名字,其實可以隨便改,不建議改;注意:value就是上面resolve(a1)中傳出來的a1,a1可以是任何對象,a2也是相同的道理。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104255.html

相關文章

  • async await詳解

    摘要:本身就是的語法糖。類似于后面代碼會等內部代碼全部完成后再執行打印結果操作符用于等待一個對象。它只能在異步函數中使用。參考附在版本位中是可以直接使用的。持續更新中來點顆吧 async await本身就是promise + generator的語法糖。 本文主要講述以下內容 async awiat 實質 async await 主要特性 async await 實質 下面使用 pro...

    Shimmer 評論0 收藏0
  • async await詳解

    摘要:本身就是的語法糖。類似于后面代碼會等內部代碼全部完成后再執行打印結果操作符用于等待一個對象。它只能在異步函數中使用。參考附在版本位中是可以直接使用的。持續更新中來點顆吧 async await本身就是promise + generator的語法糖。 本文主要講述以下內容 async awiat 實質 async await 主要特性 async await 實質 下面使用 pro...

    KavenFan 評論0 收藏0
  • async await詳解

    摘要:本身就是的語法糖。類似于后面代碼會等內部代碼全部完成后再執行打印結果操作符用于等待一個對象。它只能在異步函數中使用。參考附在版本位中是可以直接使用的。持續更新中來點顆吧 async await本身就是promise + generator的語法糖。 本文主要講述以下內容 async awiat 實質 async await 主要特性 async await 實質 下面使用 pro...

    yedf 評論0 收藏0
  • Promise加載圖片用法詳解

    摘要:現在不會用都不好意思說自己是前端,為什么火起來,一句話解決了回調嵌套和執行順序問題最重要的我感覺是解決順序問題。 現在不會用Promise都不好意思說自己是前端,Promise為什么火起來,一句話解決了回調嵌套和執行順序問題最重要的我感覺是解決順序問題。 不過開始寫之前我們先看看,promise怎么解決問題,怎么用。列舉一個順序加載圖片demo: //需求 加載三張圖片 img1,im...

    Brenner 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<