中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

JavaScript asyncAdd怎么實現異步加法

發布時間:2022-08-23 16:10:14 來源:億速云 閱讀:188 作者:iii 欄目:開發技術

這篇文章主要介紹“JavaScript asyncAdd怎么實現異步加法”,在日常操作中,相信很多人在JavaScript asyncAdd怎么實現異步加法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript asyncAdd怎么實現異步加法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

題目如下:

// 異步加法
function asyncAdd(a,b,cb){
  setTimeout(() => {
    cb(null, a + b)
  }, Math.random() * 1000)
}
async function total(){
  const res1 = await sum(1,2,3,4,5,6,4)
  const res2 = await sum(1,2,3,4,5,6,4)
  return [res1, res2]
}
total()
// 實現下 sum 函數。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。盡可能的優化這個方法的時間。
function sum(){
}

分析 asyncAdd

這里先放置最終結論:

  • 只能修改 sum 部分的內容,sum 可接收任意長度的參數

  • sum 中只能通過 asyncAdd 實現加法計算

  • sum 中需要處理異步邏輯,需要使用 Promise

  • 需要優化 sum 方法的計算時間

下面是分別通過對代碼的不同部分進行分析,獲取到的相關的信息。

直觀的基本要求

// 實現下 sum 函數。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。盡可能的優化這個方法的時間。 
function sum(){ }

最直觀的方式就是通過上述的文字描述部分,可以很容易知道題目具體要求:

  • 實現 sum 函數,即只能修改 sum 部分的內容

  • 不能直接使用加法(+),通過 asyncAdd 實現加法

  • 優化 sum 方法的計算時間

隱藏的考察點 — setTimeout & cb

// 異步加法
function asyncAdd(a, b, cb){
  setTimeout(() => {
    cb(null, a + b)
  }, Math.random() * 1000)
}

從上述內容來看,最明顯的就是 setTimeoutcb 了,其實這不難理解因為在 asyncAdd 中使用了 setTimeout 只能通過回調函數 cb 將本次計算結果返回出去,那其中的第一個參數 null 代表什么呢?

其實可以認為它是一個錯誤信息對象,如果你比較了解 node 的話,就會知道在 node 中的異步處理的回調函數通常第一個參數就是錯誤對象,用于傳遞給外部在發生錯誤時自定義后續執行邏輯等。

一句話: cb 函數會接收 錯誤對象 和 計算結果 作為參數傳遞給外部。

隱藏的考察點 — async & await

async function total(){
  const res1 = await sum(1,2,3,4,5,6,4)
  const res2 = await sum(1,2,3,4,5,6,4)
  return [res1, res2]
}

從上述的這部分來看,sum 方法的 返回值 肯定是一個 promise 類型的,因為最前面明顯的使用了 await sum(...) 的形式。

另外 total 函數返回值也必然是一個 promise 類型,因為整個 total 函數被定義為了一個 async 異步函數,可點擊此處查看詳細內容。

一句話:sum 需要返回 promise 類型的值,即 sum 一定會使用到 promise,并且從 sum(1,2,3,4,5,6,4) 可知 sum 可接收任意長度的參數。

實現 asyncAdd

具體實現

實現思路如下:

  • 考慮到外部參數長度不固定,使用剩余運算符接收所有傳入的參數

  • 考慮到 asyncAdd 中的異步操作,將其封裝為 Promise 的實現,即 caculate 函數

  • 考慮到 asyncAdd 實際只能一次接收兩個數字進行計算,使用循環的形式將多個參數分別傳入

  • 考慮到通過循環處理異步操作的順序問題,使用 async/await 來保證正確的執行順序,且 async 函數的返回值正好符合 sumPromise 類型的要求

具體代碼如下:

// 通過 ES6 的剩余運算符(...) 接收外部傳入長度不固定的參數
async function sum(...nums: number[]) {
    // 封裝 Promise 
    function caculate(num1: number, num2: number) {
        return new Promise((resolve, reject) => {
            // 調用 asyncAdd 實現加法
            asyncAdd(num1, num2, (err: any, rs: number) => {
                // 處理錯誤邏輯
                if (err) {
                    reject(err);
                    return;
                }
                // 向外部傳遞對應的計算結果
                resolve(rs);
            });
        })
    }
    let res: any = 0;
    // 通過遍歷將參數一個個進行計算
    for (const n of nums) {
        // 為了避免異步執行順序問題,使用 await 等待執行結果 
        res = await caculate(res, n);
    }
    return res;
}

進行優化

抽離內層函數
  • caculate 函數可抽離到 sum 函數外層

  • asyncAdd 函數的回調函數沒必要抽離,因為它依賴的參數和外部方法太多

function caculate(num1: number, num2: number) {
    return new Promise((resolve, reject) => {
        asyncAdd(num1, num2, (err: any, rs: number) => {
            if (err) {
                reject(err);
                return;
            }
            resolve(rs);
        });
    })
}
async function sum(...nums: number[]) {
    let res: any = 0;
    for (const n of nums) {
        res = await caculate(res, n);
    }
    return res;
}
緩存計算結果

其實你仔細觀察 total 方法,其中 sum 調用了兩次,而且參數還是一模一樣的,目的就是提示你在第二次計算相同內容時結果直接 從緩存中獲取,而不是在通過異步計算。

async function total(){
  const res1 = await sum(1,2,3,4,5,6,4)
  const res2 = await sum(1,2,3,4,5,6,4)
  return [res1, res2]
}

以下只是一個簡單的緩存方案的實現,不必過于糾結,具體實現如下:

const cash: any = {};
function isUndefined(target: any) {
    return target === void 0;
}
async function sum(...nums: number[]) {
    let res: any = 0;
    const key = nums.join('+');
    if (!isUndefined(cash[key])) return cash[key];
    for (const n of nums) {
        res = await caculate(res, n);
    }
    cash[key] = res;
    return res;
}
function caculate(num1: number, num2: number) {
    return new Promise((resolve, reject) => {
        asyncAdd(num1, num2, (err: any, rs: number) => {
            if (err) {
                reject(err);
                return;
            }
            resolve(rs);
        });
    })
}

到此,關于“JavaScript asyncAdd怎么實現異步加法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

永川市| 泰顺县| 肇庆市| 临汾市| 邵阳县| 贺兰县| 桑植县| 伊宁市| 会宁县| 乐昌市| 陇南市| 西乌珠穆沁旗| 镇江市| 九台市| 凤翔县| 治多县| 盐源县| 商河县| 赣榆县| 东安县| 普定县| 丘北县| 若羌县| 沧州市| 民丰县| 永寿县| 铜陵市| 蒙自县| 拉孜县| 新绛县| 昌宁县| 德保县| 兖州市| 舞钢市| 永兴县| 自贡市| 辽宁省| 安化县| 朝阳市| 随州市| 天气|