ES6---Promise 4:

来源:https://www.cnblogs.com/jane-panyiyun/archive/2020/04/14/12700975.html
-Advertisement-
Play Games

1. var p1 = new Promise((resolve, reject) => { }); var p2 = p1.then( result => { }, error => { } ); //可以看到p1和p2都是promise,還可以看到狀態 console.log(p1); cons ...


ES6---Promise 4: 更多案例

 

1. 

    var p1 = new Promise((resolve, reject) => {
    });
    var p2 = p1.then(
        result => { },
        error => { }
    );
    //可以看到p1和p2都是promise,還可以看到狀態
    console.log(p1);
    console.log(p2);

 

console:

 

 

2. 

    var p1 = new Promise((resolve, reject) => {
        resolve('成功了');
    });
    var p2 = p1.then(
        result => {
            console.log('2');
        },
        error => { }
    );

    console.log(p1);
    console.log(p2);

 

console:

 

 

3. 

    var p1 = new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            console.log('2');//運行在微任務列表
        },
        error => { }
    );
    console.log('abc');

 

console:

 

 

4. 

    //傳值的問題
    var p1 = new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            console.log('微任務接收數據:' + result);//運行在微任務列表
        },
        error => { }
    );
    console.log('abc');

 

console:

 

 

5.

    var p1 = new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            console.log('微任務接收數據:' + result);//運行在微任務列表
        },
        error => { }
    ).then(
        result => {
            console.log(3);
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 6. 

    var p1 = new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            console.log('微任務接收數據:' + result);//運行在微任務列表
        },
        error => { }
    ).then(
        result => {
            console.log(3 + result);
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 7. then怎麼傳值?答案用return來傳值給下麵的then

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            console.log('微任務接收數據:' + result);//運行在微任務列表
            //這裡怎麼傳值?答案用return
            return 'bbbb';
        },
        error => { }
    ).then(
        result => {
            console.log(3 + result);//3bbbb
        },
        error => { }
    )
    console.log('abc');

 

console:

 

8. 搞懂return

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //箭頭函數,右邊只有一行代碼,可以去掉{},但是要把return和分號也去掉,如下
        result => 'bbbb'//今天的其中一個任務是搞定return
        ,
        error => { }
    ).then(
        result => {
            console.log(3 + result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

9. return的類型

        resolve('成功了');//運行在主線程
    }).then(
        //箭頭函數,右邊只有一行代碼,可以去掉{},但是要把return和分號也去掉,如下
        //return的類型:字元串,數字,Symbol
        result => Symbol()//今天的其中一個任務是搞定return
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

10. return{} 返回對象,註意寫法

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //箭頭函數,右邊只有一行代碼,可以去掉{},但是要把return和分號也去掉,如下
        //return的類型:字元串,數字,Symbol, Boolean,對象{}
        result => {
            //代碼行1
            //代碼行2
            return {}
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 11. 

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串,數字,Symbol, Boolean,對象{}
        result => {
            //代碼行1
            //代碼行2
            return { name: '9999' }
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 12.

    // Promise是什麼類型?對象
    var u = new Promise(() => { });
    console.log(typeof u);//object

 

console:

 

 

13. 和14聯繫在一起對比,觀察,可以有助於理解

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise
        result => {
            //在then裡面,return一個全新的promise
            //沒有then
            return new Promise((resolve, reject) => { });
            //必須等這個then幹完活,才會繼續執行下個then
            //而這裡return的promise就一直在pending狀態,等promise發通知
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

14. 這裡then裡面return了一個promise並且發出了通知,所以下一個then可以執行

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise
        result => {
            //在then裡面,return一個全新的promise
            //沒有then
            return new Promise((resolve, reject) => {
                resolve('成功啦2')
            });
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

15. return underfined類型

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise, underfined
        result => {
            return undefined;
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

16. return null

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise, underfined, null
        result => {
            return null;
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

以上:

  •         return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise, underfined, null
  •         return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的

 

17.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        result => {
            return new Promise((resolve, reject) => {
                resolve('ok');//這個通知如果不發出,下一個then不會執行
            });
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

18.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise, underfined, null
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return new Promise((resolve, reject) => {
                reject('not ok');
            });
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => {
            console.log(4);
            console.log(error);
        }
    )

 

console:

 

 

 

19.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, 對象object包含promise, underfined, null
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return new Promise((resolve, reject) => {
                resolve('ok22')
            });
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

20. return的類型,其中,{}對象object包含promise或者含有then的object

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, underfined, null
        //             {}對象object包含promise或者含有then的object
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return { then: '123' };
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

21.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, underfined, null
        //             {}對象object包含promise或者含有then的object
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return {
                then: function (resolve, reject) { }
                //此時查看console列印結果,會發現沒有執行
                //因為這個then沒當成了promise,在等發通知
            };
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 

22.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, underfined, null
        //             {}對象object包含promise或者含有then的object
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return {
                //當函數名和對象的key一樣的時候,可以把function和key、冒號刪掉
                then(resolve, reject) {
                    resolve('人');
                }
            };
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

23.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, underfined, null
        //             {}對象object包含promise或者含有then的object
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的
        result => {
            return {
                //當函數名和對象的key一樣的時候,可以把function和key、冒號刪掉
                then(resolve, reject) {
                    reject('鬼');
                }
            };
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 24. class也是個對象

    class Myclass {
        hi() { }
    }

    var kk = new Myclass();
    console.log(kk);

 

console:

 

25.

    class Myclass {
        hi() { }
    }

    var kk = new Myclass();
    console.log(typeof kk);

 

console:

 

 

26. 用到then(resolve, reject){}實際就是個promise了

    class Myclass {
        then(resolve, reject) { }
    }

    var kk = new Myclass();
    console.log(kk);

 

console:

 

 27.

    new Promise((resolve, reject) => {
        resolve('成功了');//運行在主線程
    }).then(
        //return的類型:字元串, 數字, Symbol, Boolean, underfined, null
        //             {}對象object包含promise或者含有then的object(class)
        //return 所有類型都可以(7種),但是如果object類型為promise的話,需要等待的

        result => {
            class MyClass {
                then(resolve, reject) {
                    resolve('ok2')
                }
            }
            return new MyClass();
        }
        , error => { }
    ).then(
        result => {
            console.log(3);
            console.log(result);//運行在微任務列表
        },
        error => { }
    )
    console.log('abc');

 

console:

 

 以上更新:

  •        return的類型:字元串, 數字, Symbol, Boolean, underfined, null
  •                                {}對象object包含promise或者含有then的object(class)

 

28. 實際經常封裝成一個命名函數,可以重覆使用

 

 

<script src="./download.js"></script>
<script type="text/javascript">
    console.log(downloadData());
</script>

 

console:

 

 

29.

 

 

<script src="./download.js"></script>
<script type="text/javascript">
    console.log(downloadData());
</script>

 

console:

 

 

30.

 

 

console:

 

 

31.

 

 

<script src="./download.js"></script>
<script type="text/javascript">
    downloadData().then(
        result => {
            COV19(result).then(
                peopleCount => {
                    console.log('確診人數為:' + peopleCount);
                }
            )
        }
    );
</script>

 

console:

 

 

32. 顯示在頁面

<script src="./download.js"></script>

<div id="aa"></div>
<script type="text/javascript">
    downloadData().then(
        result => {
            COV19(result).then(
                peopleCount => {
                    document.getElementById("aa").innerText
                        = '確診人數為:' + peopleCount;
                }
            )
        }
    );
</script>

 

console:

 

33.

 

 

 

<script src="./download.js"></script>
<div id="aa"></div>
<script type="text/javascript">
    downloadData().then(
        result => {
            COV19(result).then(
                peopleCount => {
                    document.getElementById("aa").innerText
                        = '確診人數為:' + peopleCount;
                }
            )
        }
    );
</script>

 

console:

 

 

 2秒後

 

 

 

 

34.

<script src="./download.js"></script>
<div id="aa"></div>
<script type="text/javascript">
    downloadData().then(
        result => {
            COV19(result).then(
                peopleCount => {
                    document.getElementById("aa").innerText
                        = '確診人數為:' + peopleCount;
                }
            )
        }
    );
    document.getElementById("aa").innerText = 'loading...'
</script>

 

console:

 

 

 loading後

 

35.

<body>
    <div id="mydiv">
        <div>....</div>
    </div>

</body>
<script type="text/javascript">
    //JS單線程,多任務【微任務隊列,巨集任務隊列】
    new Promise((resolve, reject) => {
        document.getElementById('mydiv').innerHTML += '<div>按下開關洗衣服</div>';
    })
    document.getElementById('mydiv').innerHTML += '<div>去學習</div>';
</script>

 

console:

 

 

36.

<script type="text/javascript">
    //JS單線程,多任務【微任務隊列,巨集任務隊列】
    new Promise((resolve, reject) => {
        //走30分鐘
        document.getElementById('mydiv').innerHTML += '<div>按下開關洗衣服</div>';
        setTimeout(() => {
            resolve('洗完了')
        }, 3000);

    }).then(result => {
        console.log('洗完了');
        document.getElementById('mydiv').innerHTML += '<div>晾衣服</div>';
    });
    document.getElementById('mydiv').innerHTML += '<div>去學習</div>';
</script>

 

console:

 

 3秒後通知

 

 37.

<script type="text/javascript">
    //JS單線程,多任務【微任務隊列,巨集任務隊列】
    new Promise((resolve, reject) => {
        //走30分鐘
        document.getElementById('mydiv').innerHTML += '<div>按下開關洗衣服</div>';
        setTimeout(() => {
            resolve('洗完了');

        }, 3000);

    }).then(result => {
        console.log('洗完了');
        document.getElementById('mydiv').innerHTML += '<div>晾衣服</div>';
        return {
            then(resolve, reject) {
                setTimeout(() => {
                    resolve('衣服幹了');
                    console.log('衣服幹了');
                }, 3000);
            }
        }
    }).then((result) => {
        document.getElementById('mydiv').innerHTML += '<div>收衣服</div>';
    });
    document.getElementById('mydiv').innerHTML += '<div>去學習</div>';
</script>

 

console:

 

 

以上,一個人洗衣服,收衣服的過程,模擬JS單線程,多任務的功能

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾篇都是長篇大論,一次看完的確有些費盡,今天簡單些,分享一個開發中使用attr() 的技巧,可能大家都沒有這樣使用過。它配合ES6標準中模板字元串模塊使用。簡單看下模板字元串它的使用: // 傳統的 JavaScript 語言,輸出模板通常是這樣寫的(下麵使用了 jQuery 的方法)。 $('# ...
  • 首先是安裝 在index.js中引入樣式 跟著官網點組件 import React,{Component} from 'react'; import { Button } from 'antd'; class Counter extends Component{ render(){ console. ...
  • 生命周期函數指的是組件在某一時刻會自動執行的函數 constructor可以看成一個類的普通生命周期函數,但不是react獨有的生命周期函數 render() 是數據發生變化時會自動執行的函數,因此屬於react的生命周期函數 mounting只在第一次渲染時會執行 import React,{Co ...
  • 目錄 為什麼分析asap asap概述 asap源碼解析—Node版 參考 1.為什麼分析asap 在之前的文章 "async和await是如何實現非同步編程?" 中的 “淺談Promise如何實現非同步執行” 小節,提到了 Promise 非同步執行是通過 "asap" 這個庫來實現的。所以為了進一步深 ...
  • 3-1什麼是數組?變數用來存儲數據,一個變數只能存儲一個內容,如果要存儲多個數據怎麼辦?此時就需要用到數組,數組是一個值的集合,每個值都有一個索引號,從0開始,每個索引都有一個相應的值,根據需要添加更多數值。 1 <script type="text/javascript"> 2 var myarr ...
  • 括弧功能未實現,後續更 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <tit ...
  • 眾所周知,Vue 2.x 的數據綁定是通過 defineProperty。而在 Vue 3.x 的設計中,數據綁定是通過 Proxy 實現的,這兩者到底有何異同? 一、definePropety defineProperty 是 Object 的一個方法,可以在對象上新增或編輯某個屬性,可編輯的內容 ...
  • 實例:獲取button元素離頁面頂部的距離 ref寫在html元素上 import React,{Component,Fragment} from 'react'; import Child from './Child'; class Counter extends Component{ const ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...