App下載

javascript怎么解決異步問題?異步解決方案分享!

猿友 2021-06-10 16:02:00 瀏覽數(shù) (3339)
反饋

我們通過學習都是知道JavaScript是一門單線程的語言,我們都知道雙線程肯定會比單線程好,所以單線程在執(zhí)行一些比較消耗時間的操作的時候就需要使用異步執(zhí)行的操作,不然很容易崩掉。那么今天我們就來說說:“javascript怎么解決異步問題?異步解決方案分享!”這個問題吧!

1、使用回調(diào)函數(shù)

有學過和使用過jQuery的小伙伴就會知道這個方法,這是個將自己作為變量傳遞給另一個函數(shù)的函數(shù),是在主體函數(shù)執(zhí)行完成之后在執(zhí)行的。代碼如下:

let delayWithCallback = (time, callback) => {
    console.log('handle...')
    setTimeout(() => {
        if (typeof callback === 'function') {
            callback(`success`)
        }
    }, time)
}

代碼中可以看到我們在callback方法里面處理回調(diào)問題。

2.使用Promise

這個方法是通過本身構造函數(shù)在接受一個函數(shù)作為參數(shù),從而分別來表示操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)

,Promise的參數(shù)分別是resolve和reject;代碼如下:

let index = 1;
let delayWithPromise = (time) => {
    return new Promise((resolve, reject) => {
        console.log(`task${index} handle...`)
        index++
        setTimeout(() => {
            resolve('success')
        }, time)
    })
}

我們還可以在這個方法之上使用then方法進行回調(diào)。代碼如下:

let func2 = () => {
    console.log('start')
    delayWithPromise(1000).then(result => {
        console.log(result)
        console.log('end')
    })
} 
func2()

通過代碼我們可以知道then這個方式是在Promise.prototype.then()中接收兩個參數(shù)來實現(xiàn)的。

3.使用async或者await的解決異步問題

由于這兩個方法是ES7中的新特性所以關于他們的用法有這些特點:

(1).我們可以在function前面加async關鍵字就可以表示這是個async函數(shù);而且async的返回值是一個Promise對象,所以我們還可以用then方法添加回調(diào)函數(shù)。

(2).當我們在使用await的時候后面跟著的應該是個promise對象,如果不是的話就會被轉(zhuǎn)成個含有resolve的Promise對象,而且await是表示在等待promise返回結果了之后再繼續(xù)執(zhí)行的。

下面是一個相關的代碼:

let func6 = async () => {
    console.log('start')
    let result = await delayWithPromise(1000);
    console.log(result)
    console.log('end')
}
func6()

(3).使用async或者await一個個執(zhí)行代碼如下:

let func7 = async () => {
    console.log('start')
    let result1 = await delayWithPromise(500)
    let result2 = await delayWithPromise(500)
    console.dir(result1, result2)
    console.log('end')
}
func7()

當我們使用這個方法的時候這個功能出來是會依照程序一步步來的。還設有500ms的時間間隔。

(4).使用async或者await同時執(zhí)行方法

let func8 = async () => {
    console.log('start')
    let [result1, result2] = await Promise.all([
        delayWithPromise(500),
        delayWithPromise(500)
    ])
    console.dir(result1, result2)
}
func8()
總結:

以上就是今天有關于“javascript怎么解決異步問題?異步解決方案分享!”這個問題的方法和使用。更多有關的學習知識我們都可以在W3cschool中進行搜素學習和了解。


0 人點贊