<dfn id="hx5t3"><strike id="hx5t3"><em id="hx5t3"></em></strike></dfn>

    <thead id="hx5t3"></thead><nobr id="hx5t3"><font id="hx5t3"><rp id="hx5t3"></rp></font></nobr>

    <listing id="hx5t3"></listing>

    <var id="hx5t3"></var>
    <big id="hx5t3"></big>

      
      

      <output id="hx5t3"><ruby id="hx5t3"></ruby></output>
      <menuitem id="hx5t3"><dfn id="hx5t3"></dfn></menuitem>

      <big id="hx5t3"></big>

        錦程

        錦程 查看完整檔案

        西安編輯內蒙古農業大學  |  null 編輯某公司  |  搬磚-web前端工程師 編輯填寫個人主網站
        編輯

        這個人很懶

        個人動態

        錦程 贊了文章 · 3月23日

        理解 JavaScript 的 async/await

        2020-06-04 更新

        JavaScript 中的 async/await 是 AsyncFunction 特性 中的關鍵字。目前為止,除了 IE 之外,常用瀏覽器和 Node (v7.6+) 都已經支持該特性。具體支持情況可以在 這里 查看。


        我第一次看到 async/await 這組關鍵字并不是在 JavaScript 語言里,而是在 C# 5.0 的語法中。C# 的 async/await 需要在 .NET Framework 4.5 以上的版本中使用,因此我還很悲傷了一陣——為了要兼容 XP 系統,我們開發的軟件不能使用高于 4.0 版本的 .NET Framework。

        我之前在《閑談異步調用“扁平”化》 中就談到了這個問題。無論是在 C# 還是 JavaScript 中,async/await 都是非常棒的特性,它們也都是非常甜的語法糖。C# 的 async/await 實現離不開 Task 或 Task\<Result\> 類,而 JavaScript 的 async/await 實現,也離不開 Promise。

        現在拋開 C# 和 .NET Framework,專心研究下 JavaScript 的 async/await。

        1. async 和 await 在干什么

        任意一個名稱都是有意義的,先從字面意思來理解。async 是“異步”的簡寫,而 await 可以認為是 async wait 的簡寫。所以應該很好理解 async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執行完成。

        另外還有一個很有意思的語法規定,await 只能出現在 async 函數中。然后細心的朋友會產生一個疑問,如果 await 只能出現在 async 函數中,那這個 async 函數應該怎么調用?

        如果需要通過 await 來調用一個 async 函數,那這個調用的外面必須得再包一個 async 函數,然后……進入死循環,永無出頭之日……

        如果 async 函數不需要 await 來調用,那 async 到底起個啥作用?

        1.1. async 起什么作用

        這個問題的關鍵在于,async 函數是怎么處理它的返回值的!

        我們當然希望它能直接通過 return 語句返回我們想要的值,但是如果真是這樣,似乎就沒 await 什么事了。所以,寫段代碼來試試,看它到底會返回什么:

        async function testAsync() {
            return "hello async";
        }
        
        const result = testAsync();
        console.log(result);

        看到輸出就恍然大悟了——輸出的是一個 Promise 對象。

        c:\var\test> node --harmony_async_await .
        Promise { 'hello async' }

        所以,async 函數返回的是一個 Promise 對象。從文檔中也可以得到這個信息。async 函數(包含函數語句、函數表達式、Lambda表達式)會返回一個 Promise 對象,如果在函數中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象。

        補充知識點 [2020-06-04]

        Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的簡寫,可以用于快速封裝字面量對象或其他對象,將其封裝成 Promise 實例。

        async 函數返回的是一個 Promise 對象,所以在最外層不能用 await 獲取其返回值的情況下,我們當然應該用原來的方式:then() 鏈來處理這個 Promise 對象,就像這樣

        testAsync().then(v => {
            console.log(v);    // 輸出 hello async
        });

        現在回過頭來想下,如果 async 函數沒有返回值,又該如何?很容易想到,它會返回 Promise.resolve(undefined)。

        聯想一下 Promise 的特點——無等待,所以在沒有 await 的情況下執行 async 函數,它會立即執行,返回一個 Promise 對象,并且,絕不會阻塞后面的語句。這和普通返回 Promise 對象的函數并無二致。

        那么下一個關鍵點就在于 await 關鍵字了。

        1.2. await 到底在等啥

        一般來說,都認為 await 是在等待一個 async 函數完成。不過按語法說明,await 等待的是一個表達式,這個表達式的計算結果是 Promise 對象或者其它值(換句話說,就是沒有特殊限定)。

        因為 async 函數返回一個 Promise 對象,所以 await 可以用于等待一個 async 函數的返回值——這也可以說是 await 在等 async 函數,但要清楚,它等的實際是一個返回值。注意到 await 不僅僅用于等 Promise 對象,它可以等任意表達式的結果,所以,await 后面實際是可以接普通函數調用或者直接量的。所以下面這個示例完全可以正確運行

        function getSomething() {
            return "something";
        }
        
        async function testAsync() {
            return Promise.resolve("hello async");
        }
        
        async function test() {
            const v1 = await getSomething();
            const v2 = await testAsync();
            console.log(v1, v2);
        }
        
        test();

        1.3. await 等到了要等的,然后呢

        await 等到了它要等的東西,一個 Promise 對象,或者其它值,然后呢?我不得不先說,await 是個運算符,用于組成表達式,await 表達式的運算結果取決于它等的東西。

        如果它等到的不是一個 Promise 對象,那 await 表達式的運算結果就是它等到的東西。

        如果它等到的是一個 Promise 對象,await 就忙起來了,它會阻塞后面的代碼,等著 Promise 對象 resolve,然后得到 resolve 的值,作為 await 表達式的運算結果。

        看到上面的阻塞一詞,心慌了吧……放心,這就是 await 必須用在 async 函數中的原因。async 函數調用不會造成阻塞,它內部所有的阻塞都被封裝在一個 Promise 對象中異步執行。

        2. async/await 幫我們干了啥

        2.1. 作個簡單的比較

        上面已經說明了 async 會將其后的函數(函數表達式或 Lambda)的返回值封裝成一個 Promise 對象,而 await 會等待這個 Promise 完成,并將其 resolve 的結果返回出來。

        現在舉例,用 setTimeout 模擬耗時的異步操作,先來看看不用 async/await 會怎么寫

        function takeLongTime() {
            return new Promise(resolve => {
                setTimeout(() => resolve("long_time_value"), 1000);
            });
        }
        
        takeLongTime().then(v => {
            console.log("got", v);
        });

        如果改用 async/await 呢,會是這樣

        function takeLongTime() {
            return new Promise(resolve => {
                setTimeout(() => resolve("long_time_value"), 1000);
            });
        }
        
        async function test() {
            const v = await takeLongTime();
            console.log(v);
        }
        
        test();

        眼尖的同學已經發現 takeLongTime() 沒有申明為 async。實際上,takeLongTime() 本身就是返回的 Promise 對象,加不加 async 結果都一樣,如果沒明白,請回過頭再去看看上面的“async 起什么作用”。

        又一個疑問產生了,這兩段代碼,兩種方式對異步調用的處理(實際就是對 Promise 對象的處理)差別并不明顯,甚至使用 async/await 還需要多寫一些代碼,那它的優勢到底在哪?

        2.2. async/await 的優勢在于處理 then 鏈

        單一的 Promise 鏈并不能發現 async/await 的優勢,但是,如果需要處理由多個 Promise 組成的 then 鏈的時候,優勢就能體現出來了(很有意思,Promise 通過 then 鏈來解決多層回調的問題,現在又用 async/await 來進一步優化它)。

        假設一個業務,分多個步驟完成,每個步驟都是異步的,而且依賴于上一個步驟的結果。我們仍然用 setTimeout 來模擬異步操作:

        /**
         * 傳入參數 n,表示這個函數執行的時間(毫秒)
         * 執行的結果是 n + 200,這個值將用于下一步驟
         */
        function takeLongTime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            });
        }
        
        function step1(n) {
            console.log(`step1 with ${n}`);
            return takeLongTime(n);
        }
        
        function step2(n) {
            console.log(`step2 with ${n}`);
            return takeLongTime(n);
        }
        
        function step3(n) {
            console.log(`step3 with ${n}`);
            return takeLongTime(n);
        }

        現在用 Promise 方式來實現這三個步驟的處理

        function doIt() {
            console.time("doIt");
            const time1 = 300;
            step1(time1)
                .then(time2 => step2(time2))
                .then(time3 => step3(time3))
                .then(result => {
                    console.log(`result is ${result}`);
                    console.timeEnd("doIt");
                });
        }
        
        doIt();
        
        // c:\var\test>node --harmony_async_await .
        // step1 with 300
        // step2 with 500
        // step3 with 700
        // result is 900
        // doIt: 1507.251ms

        輸出結果 resultstep3() 的參數 700 + 200 = 900。doIt() 順序執行了三個步驟,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 計算的結果一致。

        如果用 async/await 來實現呢,會是這樣

        async function doIt() {
            console.time("doIt");
            const time1 = 300;
            const time2 = await step1(time1);
            const time3 = await step2(time2);
            const result = await step3(time3);
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        }
        
        doIt();

        結果和之前的 Promise 實現是一樣的,但是這個代碼看起來是不是清晰得多,幾乎跟同步代碼一樣

        2.3. 還有更酷的

        現在把業務要求改一下,仍然是三個步驟,但每一個步驟都需要之前每個步驟的結果。

        function step1(n) {
            console.log(`step1 with ${n}`);
            return takeLongTime(n);
        }
        
        function step2(m, n) {
            console.log(`step2 with ${m} and ${n}`);
            return takeLongTime(m + n);
        }
        
        function step3(k, m, n) {
            console.log(`step3 with ${k}, ${m} and ${n}`);
            return takeLongTime(k + m + n);
        }

        這回先用 async/await 來寫:

        async function doIt() {
            console.time("doIt");
            const time1 = 300;
            const time2 = await step1(time1);
            const time3 = await step2(time1, time2);
            const result = await step3(time1, time2, time3);
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        }
        
        doIt();
        
        // c:\var\test>node --harmony_async_await .
        // step1 with 300
        // step2 with 800 = 300 + 500
        // step3 with 1800 = 300 + 500 + 1000
        // result is 2000
        // doIt: 2907.387ms

        除了覺得執行時間變長了之外,似乎和之前的示例沒啥區別??!別急,認真想想如果把它寫成 Promise 方式實現會是什么樣子?

        function doIt() {
            console.time("doIt");
            const time1 = 300;
            step1(time1)
                .then(time2 => {
                    return step2(time1, time2)
                        .then(time3 => [time1, time2, time3]);
                })
                .then(times => {
                    const [time1, time2, time3] = times;
                    return step3(time1, time2, time3);
                })
                .then(result => {
                    console.log(`result is ${result}`);
                    console.timeEnd("doIt");
                });
        }
        
        doIt();

        有沒有感覺有點復雜的樣子?那一堆參數處理,就是 Promise 方案的死穴—— 參數傳遞太麻煩了,看著就暈!

        3. 洗洗睡吧

        就目前來說,已經理解 async/await 了吧?但其實還有一些事情沒提及——Promise 有可能 reject 啊,怎么處理呢?如果需要并行處理3個步驟,再等待所有結果,又該怎么處理呢?

        阮一峰老師已經說過了,我就懶得說了。

        4. 推薦相關文章

        5. 來跟邊城(作者)學 更新@2020-11-14

        TypeScript從入門到實踐 【2020 版】

        TypeScript從入門到實踐 【2020 版】

        6. 關于轉載 補充@2020-03-05

        常有讀者問是否可以轉載。

        筆者表示歡迎各位轉載,但轉載時一定注明作者和出處,謝謝!


        公眾號-邊城客棧
        請關注公眾號 邊城客棧 ?

        看完了先別走,點個贊啊 ?,贊賞 ? 也行!

        查看原文

        贊 1341 收藏 1130 評論 134

        錦程 收藏了文章 · 3月23日

        理解 JavaScript 的 async/await

        2020-06-04 更新

        JavaScript 中的 async/await 是 AsyncFunction 特性 中的關鍵字。目前為止,除了 IE 之外,常用瀏覽器和 Node (v7.6+) 都已經支持該特性。具體支持情況可以在 這里 查看。


        我第一次看到 async/await 這組關鍵字并不是在 JavaScript 語言里,而是在 C# 5.0 的語法中。C# 的 async/await 需要在 .NET Framework 4.5 以上的版本中使用,因此我還很悲傷了一陣——為了要兼容 XP 系統,我們開發的軟件不能使用高于 4.0 版本的 .NET Framework。

        我之前在《閑談異步調用“扁平”化》 中就談到了這個問題。無論是在 C# 還是 JavaScript 中,async/await 都是非常棒的特性,它們也都是非常甜的語法糖。C# 的 async/await 實現離不開 Task 或 Task\<Result\> 類,而 JavaScript 的 async/await 實現,也離不開 Promise。

        現在拋開 C# 和 .NET Framework,專心研究下 JavaScript 的 async/await。

        1. async 和 await 在干什么

        任意一個名稱都是有意義的,先從字面意思來理解。async 是“異步”的簡寫,而 await 可以認為是 async wait 的簡寫。所以應該很好理解 async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執行完成。

        另外還有一個很有意思的語法規定,await 只能出現在 async 函數中。然后細心的朋友會產生一個疑問,如果 await 只能出現在 async 函數中,那這個 async 函數應該怎么調用?

        如果需要通過 await 來調用一個 async 函數,那這個調用的外面必須得再包一個 async 函數,然后……進入死循環,永無出頭之日……

        如果 async 函數不需要 await 來調用,那 async 到底起個啥作用?

        1.1. async 起什么作用

        這個問題的關鍵在于,async 函數是怎么處理它的返回值的!

        我們當然希望它能直接通過 return 語句返回我們想要的值,但是如果真是這樣,似乎就沒 await 什么事了。所以,寫段代碼來試試,看它到底會返回什么:

        async function testAsync() {
            return "hello async";
        }
        
        const result = testAsync();
        console.log(result);

        看到輸出就恍然大悟了——輸出的是一個 Promise 對象。

        c:\var\test> node --harmony_async_await .
        Promise { 'hello async' }

        所以,async 函數返回的是一個 Promise 對象。從文檔中也可以得到這個信息。async 函數(包含函數語句、函數表達式、Lambda表達式)會返回一個 Promise 對象,如果在函數中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象。

        補充知識點 [2020-06-04]

        Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的簡寫,可以用于快速封裝字面量對象或其他對象,將其封裝成 Promise 實例。

        async 函數返回的是一個 Promise 對象,所以在最外層不能用 await 獲取其返回值的情況下,我們當然應該用原來的方式:then() 鏈來處理這個 Promise 對象,就像這樣

        testAsync().then(v => {
            console.log(v);    // 輸出 hello async
        });

        現在回過頭來想下,如果 async 函數沒有返回值,又該如何?很容易想到,它會返回 Promise.resolve(undefined)。

        聯想一下 Promise 的特點——無等待,所以在沒有 await 的情況下執行 async 函數,它會立即執行,返回一個 Promise 對象,并且,絕不會阻塞后面的語句。這和普通返回 Promise 對象的函數并無二致。

        那么下一個關鍵點就在于 await 關鍵字了。

        1.2. await 到底在等啥

        一般來說,都認為 await 是在等待一個 async 函數完成。不過按語法說明,await 等待的是一個表達式,這個表達式的計算結果是 Promise 對象或者其它值(換句話說,就是沒有特殊限定)。

        因為 async 函數返回一個 Promise 對象,所以 await 可以用于等待一個 async 函數的返回值——這也可以說是 await 在等 async 函數,但要清楚,它等的實際是一個返回值。注意到 await 不僅僅用于等 Promise 對象,它可以等任意表達式的結果,所以,await 后面實際是可以接普通函數調用或者直接量的。所以下面這個示例完全可以正確運行

        function getSomething() {
            return "something";
        }
        
        async function testAsync() {
            return Promise.resolve("hello async");
        }
        
        async function test() {
            const v1 = await getSomething();
            const v2 = await testAsync();
            console.log(v1, v2);
        }
        
        test();

        1.3. await 等到了要等的,然后呢

        await 等到了它要等的東西,一個 Promise 對象,或者其它值,然后呢?我不得不先說,await 是個運算符,用于組成表達式,await 表達式的運算結果取決于它等的東西。

        如果它等到的不是一個 Promise 對象,那 await 表達式的運算結果就是它等到的東西。

        如果它等到的是一個 Promise 對象,await 就忙起來了,它會阻塞后面的代碼,等著 Promise 對象 resolve,然后得到 resolve 的值,作為 await 表達式的運算結果。

        看到上面的阻塞一詞,心慌了吧……放心,這就是 await 必須用在 async 函數中的原因。async 函數調用不會造成阻塞,它內部所有的阻塞都被封裝在一個 Promise 對象中異步執行。

        2. async/await 幫我們干了啥

        2.1. 作個簡單的比較

        上面已經說明了 async 會將其后的函數(函數表達式或 Lambda)的返回值封裝成一個 Promise 對象,而 await 會等待這個 Promise 完成,并將其 resolve 的結果返回出來。

        現在舉例,用 setTimeout 模擬耗時的異步操作,先來看看不用 async/await 會怎么寫

        function takeLongTime() {
            return new Promise(resolve => {
                setTimeout(() => resolve("long_time_value"), 1000);
            });
        }
        
        takeLongTime().then(v => {
            console.log("got", v);
        });

        如果改用 async/await 呢,會是這樣

        function takeLongTime() {
            return new Promise(resolve => {
                setTimeout(() => resolve("long_time_value"), 1000);
            });
        }
        
        async function test() {
            const v = await takeLongTime();
            console.log(v);
        }
        
        test();

        眼尖的同學已經發現 takeLongTime() 沒有申明為 async。實際上,takeLongTime() 本身就是返回的 Promise 對象,加不加 async 結果都一樣,如果沒明白,請回過頭再去看看上面的“async 起什么作用”。

        又一個疑問產生了,這兩段代碼,兩種方式對異步調用的處理(實際就是對 Promise 對象的處理)差別并不明顯,甚至使用 async/await 還需要多寫一些代碼,那它的優勢到底在哪?

        2.2. async/await 的優勢在于處理 then 鏈

        單一的 Promise 鏈并不能發現 async/await 的優勢,但是,如果需要處理由多個 Promise 組成的 then 鏈的時候,優勢就能體現出來了(很有意思,Promise 通過 then 鏈來解決多層回調的問題,現在又用 async/await 來進一步優化它)。

        假設一個業務,分多個步驟完成,每個步驟都是異步的,而且依賴于上一個步驟的結果。我們仍然用 setTimeout 來模擬異步操作:

        /**
         * 傳入參數 n,表示這個函數執行的時間(毫秒)
         * 執行的結果是 n + 200,這個值將用于下一步驟
         */
        function takeLongTime(n) {
            return new Promise(resolve => {
                setTimeout(() => resolve(n + 200), n);
            });
        }
        
        function step1(n) {
            console.log(`step1 with ${n}`);
            return takeLongTime(n);
        }
        
        function step2(n) {
            console.log(`step2 with ${n}`);
            return takeLongTime(n);
        }
        
        function step3(n) {
            console.log(`step3 with ${n}`);
            return takeLongTime(n);
        }

        現在用 Promise 方式來實現這三個步驟的處理

        function doIt() {
            console.time("doIt");
            const time1 = 300;
            step1(time1)
                .then(time2 => step2(time2))
                .then(time3 => step3(time3))
                .then(result => {
                    console.log(`result is ${result}`);
                    console.timeEnd("doIt");
                });
        }
        
        doIt();
        
        // c:\var\test>node --harmony_async_await .
        // step1 with 300
        // step2 with 500
        // step3 with 700
        // result is 900
        // doIt: 1507.251ms

        輸出結果 resultstep3() 的參數 700 + 200 = 900。doIt() 順序執行了三個步驟,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 計算的結果一致。

        如果用 async/await 來實現呢,會是這樣

        async function doIt() {
            console.time("doIt");
            const time1 = 300;
            const time2 = await step1(time1);
            const time3 = await step2(time2);
            const result = await step3(time3);
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        }
        
        doIt();

        結果和之前的 Promise 實現是一樣的,但是這個代碼看起來是不是清晰得多,幾乎跟同步代碼一樣

        2.3. 還有更酷的

        現在把業務要求改一下,仍然是三個步驟,但每一個步驟都需要之前每個步驟的結果。

        function step1(n) {
            console.log(`step1 with ${n}`);
            return takeLongTime(n);
        }
        
        function step2(m, n) {
            console.log(`step2 with ${m} and ${n}`);
            return takeLongTime(m + n);
        }
        
        function step3(k, m, n) {
            console.log(`step3 with ${k}, ${m} and ${n}`);
            return takeLongTime(k + m + n);
        }

        這回先用 async/await 來寫:

        async function doIt() {
            console.time("doIt");
            const time1 = 300;
            const time2 = await step1(time1);
            const time3 = await step2(time1, time2);
            const result = await step3(time1, time2, time3);
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        }
        
        doIt();
        
        // c:\var\test>node --harmony_async_await .
        // step1 with 300
        // step2 with 800 = 300 + 500
        // step3 with 1800 = 300 + 500 + 1000
        // result is 2000
        // doIt: 2907.387ms

        除了覺得執行時間變長了之外,似乎和之前的示例沒啥區別??!別急,認真想想如果把它寫成 Promise 方式實現會是什么樣子?

        function doIt() {
            console.time("doIt");
            const time1 = 300;
            step1(time1)
                .then(time2 => {
                    return step2(time1, time2)
                        .then(time3 => [time1, time2, time3]);
                })
                .then(times => {
                    const [time1, time2, time3] = times;
                    return step3(time1, time2, time3);
                })
                .then(result => {
                    console.log(`result is ${result}`);
                    console.timeEnd("doIt");
                });
        }
        
        doIt();

        有沒有感覺有點復雜的樣子?那一堆參數處理,就是 Promise 方案的死穴—— 參數傳遞太麻煩了,看著就暈!

        3. 洗洗睡吧

        就目前來說,已經理解 async/await 了吧?但其實還有一些事情沒提及——Promise 有可能 reject 啊,怎么處理呢?如果需要并行處理3個步驟,再等待所有結果,又該怎么處理呢?

        阮一峰老師已經說過了,我就懶得說了。

        4. 推薦相關文章

        5. 來跟邊城(作者)學 更新@2020-11-14

        TypeScript從入門到實踐 【2020 版】

        TypeScript從入門到實踐 【2020 版】

        6. 關于轉載 補充@2020-03-05

        常有讀者問是否可以轉載。

        筆者表示歡迎各位轉載,但轉載時一定注明作者和出處,謝謝!


        公眾號-邊城客棧
        請關注公眾號 邊城客棧 ?

        看完了先別走,點個贊啊 ?,贊賞 ? 也行!

        查看原文

        錦程 回答了問題 · 3月9日

        【求助】charts 圓環如何把端點變半圓?

        去這里找找看 餅圖

        關注 4 回答 3

        錦程 回答了問題 · 2020-12-31

        解決echarts4 餅圖如何實現描邊+間隙+外陰影效果?

        關注 2 回答 1

        錦程 回答了問題 · 2020-12-23

        echarts的legend多列如何滾動翻頁呢?

        可以換個思路,別使用自帶的圖例,自己用div實現。

        關注 2 回答 1

        錦程 回答了問題 · 2020-12-23

        svg 有辦法實現這種動畫嗎

        如靜止的圖片
        image.png
        如帶有展開效果的圓環
        image.png
        還有這樣的
        image.png
        以上幾種效果都是用svg代碼實現的,你想要的效果應該也是可以實現的吧,就是得經過一番對svg的了解學習才能實現。個人想法,了解一些基本的svg原理和方法就行,了解很深入工作用到少時間久忘記了,投入產出不成比例,這些效果基本是用js和一些DOM操作實現的,只要js過關,想法正確svg應該是條行的通的路。

        關注 4 回答 2

        錦程 回答了問題 · 2020-12-09

        svg 的 path元素有辦法調整大小和位置嗎?

        如下面是svg繪圖的方法,創建一個圓并圓圈中填充文字,通過r來控制圓的大小,其他的也應該有svg開發的一套書寫格式吧,如果有需要,可能得了解關于svg更多的東西。
        image.png
        image.png

        關注 3 回答 2

        錦程 回答了問題 · 2020-12-09

        數據大屏項目是每個項目只有一個頁面嗎?

        一般不會只有一個頁面的,是多個頁面組成的;
        你說的一個地圖為主的頁面和以圖表為主的頁面,就是兩個不同的頁面;
        大屏分不同的設計,比如在一些圖書館中看到的實時借閱書籍數量,實時進出館人數等,可能就是一個頁面,動起來切換可以通過定時器實現循環滾動切換不同的頁面元素。

        關注 3 回答 2

        錦程 回答了問題 · 2020-12-09

        如何判斷動態插入的html解析完畢?

        看看html1中有沒有特殊id,class之類的元素,通過document.getElementById等DOM查找元素的方法作為一個判斷依據試試

        關注 3 回答 3

        錦程 提出了問題 · 2020-11-17

        js俄羅斯方塊

        對一些小游戲很感興趣,js實現俄羅斯方塊需要什么技術儲備和知識點,還是先從簡單的小游戲開始練習呢。對游戲不是很了解,查過一些資料,大部分好像是用基于白鷺引擎開發的,這種游戲是不是多是調用引擎的一些API實現的呢,想學習點基本知識,提高下自己的編程能力,方向該是什么樣的。

        關注 2 回答 2

        認證與成就

        • 獲得 7 次點贊
        • 獲得 3 枚徽章 獲得 0 枚金徽章, 獲得 0 枚銀徽章, 獲得 3 枚銅徽章

        擅長技能
        編輯

        開源項目 & 著作
        編輯

        (??? )
        暫時沒有

        注冊于 2020-01-01
        個人主頁被 738 人瀏覽

        一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕