91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

理解promise的三種姿勢

發布時間:2020-06-25 20:38:55 來源:網絡 閱讀:197 作者:Fundebug 欄目:web開發

譯者按: 對于Promise,也許你會用了,卻并不理解;也許你理解了,卻只可意會不可言傳。這篇博客將從3個簡單的視角理解Promise,應該對你有所幫助。

  • 原文: Three ways of understanding Promises
  • 譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯,并且對源代碼進行了大量修改。另外,本文版權歸原作者所有,翻譯僅用于學習。

示例1中,asyncFunc()函數返回的是一個Promise實例:

// 示例1
function asyncFunc()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function()
        {
            resolve('Hello, Fundebug!');
        }, 100);
    });
}

asyncFunc()
    .then(function(x)
    {
        console.log(x); // 1秒之后打印"Hello, Fundebug!"
    });

1秒之后,Promise實例的狀態變為resolved,就會觸發then綁定的回調函數,打印resolve值,即"Hello, Fundebug!"。

那么,什么是Promise呢?

  • Promise調用是阻塞的
  • Promise中保存了異步操作結果
  • Promise是一個事件

Promise調用是阻塞的

示例2可以幫助我們理解阻塞

// 示例2
function asyncFunc()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function()
        {
            resolve('Hello, Fundebug!');
        }, 1000);
    });
}

async function main()
{
    const x = await asyncFunc(); // (A)
    console.log(x); // (B) 1秒之后打印"Hello, Fundebug!"
}

main();

以上代碼是采用Async/Await語法寫的,與示例1完全等價。await的中文翻譯即為"等待",這里可以"望文生義"。因此,相比于使用Promise實現,它更加直觀地展示了什么是阻塞

  • (A)行: 等待asyncFunc()執行,直到它返回結果,并賦值給變量x
  • (B)行: 打印x

事實上,使用Promise實現時,也需要等待asyncFunc()執行,之后再調用then綁定的回調函數。因此,調用Promise時,代碼也是阻塞的。

Promise中保存了異步操作結果

如果某個函數返回Promise實例,則這個Promise最初相當于一個空白的容器,當函數執行結束時,其結果將會放進這個容器。示例3通過數組模擬了這個過程:

// 示例3
function asyncFunc()
{
    const blank = [];
    setTimeout(function()
    {
        blank.push('Hello, Fundebug!');
    }, 1000);
    return blank;
}

const blank = asyncFunc();

console.log(blank);  // 打印"[]"

setTimeout(function()
{
    const x = blank[0]; // (A)
    console.log(x); // 2秒之后打印"Hello, Fundebug!"
}, 2000);

開始時,blank為空數組,1秒之后,"Hello, Fundebug!"被添加到數組中,為了確保成功,我們需要在2秒之后從blank數組中讀取結果。

對于Promise,我們不需要通過數組或者其他變量來傳遞結果,then所綁定的回調函數可以通過參數獲取函數執行的結果。

Promise是一個事件

示例4模擬了事件:

// 示例4
function asyncFunc()
{
    const eventEmitter = {
        success: []
    };

    setTimeout(function()
    {
        for (const handler of eventEmitter.success)
        {
            handler('Hello, Fundebug!');
        }
    }, 1000);

    return eventEmitter;
}

asyncFunc()
    .success.push(function(x)
    {
        console.log(x); // 1秒之后打印"Hello, Fundebug!"
    });

調用asyncFunc()之后,sucesss數組其實是空的,將回調函數push進數組,相當于綁定了事件的回調函數。1秒之后,setTimeout定時結束,則相當于事件觸發了,這時sucess數組中已經注冊了回調函數,于是打印"Hello, Fundebug!"。

Promise成功resolve時,會觸發then所綁定的回調函數,這其實就是事件。

參考

  • Promises for asynchronous programming
  • Async functions
  • ECMAScript 6 入門 - Promise對象

關于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,得到了Google、360、金山軟件、百姓網等眾多知名用戶的認可。歡迎免費試用!

理解promise的三種姿勢

版權聲明

轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/25/3-ways-to-understand-promise/

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮北市| 上思县| 景洪市| 常山县| 巫山县| 青田县| 保定市| 景泰县| 改则县| 远安县| 手游| 清镇市| 大余县| 右玉县| 晋宁县| 赫章县| 石景山区| 仙桃市| 威宁| 环江| 建阳市| 大新县| 大城县| 永定县| 颍上县| 五莲县| 南安市| 仪陇县| 资兴市| 盐亭县| 新邵县| 怀来县| 苗栗县| 晋江市| 沙雅县| 武穴市| 乌拉特后旗| 宁河县| 祁东县| 海原县| 周宁县|