異步與回調

異步

我對異步的明白:

  1. 異步是不等結果,往下實行;同步是等結果湧現后,再往下實行
  2. 代碼中湧現異步順序時,如例2中,實行遞次就會發生變化
  3. 運用回調,就是讓實行遞次不會發生變化

但這一定不是異步要表達的意義,由於下面的例子是完全是異步的負面結果,那異步到底有啥作用?

下面的例子是處理異步帶來的題目,而非異步的長處。

例子:

1、下面的順序f1()f2(),…,f5(),它會根據遞次從上往下的遞次實行,就是同步。

f1 =function(){console.log(1)}
f2 =function(){console.log(2)}
f3 =function(){console.log(3)}
f4 =function(){console.log(4)}
f5 =function(){console.log(5)}

f1()
f2()
f3()
f4()
f5()

2、如果f1()是個異步函數,它的實行遞次就會發生變化f2(),…,f5()f1()

f1 =function(){
    setTimeout(function(){
        console.log(1)
    },10)
}
f2 =function(){console.log(2)}
f3 =function(){console.log(3)}
f4 =function(){console.log(4)}
f5 =function(){console.log(5)}

f1()
f2()
f3()
f4()
f5()

3、這不是我們想要的結果,我們想要的結果是f1()f2()順次運轉,就需要運用回調函數,定義是將函數A作為參數,傳入函數B

f1 =function(fn){
    setTimeout(function(){
        console.log(1)
        fn.call()
    },10)
}
f2 =function(fn){console.log(2);fn.call()}
f3 =function(fn){console.log(3);fn.call()}
f4 =function(fn){console.log(4);fn.call()}
f5 =function(fn){console.log(5);fn.call()}

f1(()=>{
    f2(()=>{
        f3(()=>{
            f4(()=>{
                f5()
            })
        })
    })
})

4、或許運用Promise,更能表現實行的遞次

f1 =function(){
    return new Promise(function(resolve){
        setTimeout(function(){
            console.log(1)
            resolve.call()
    },10)
    })
}
f2 =function(){console.log(2)}
f3 =function(){console.log(3)}
f4 =function(){console.log(4)}
f5 =function(){console.log(5)}

f1().then(f2).then(f3).then(f4).then(f5)

回調

把函數 A 作為參數傳入函數 B 中

function async(f1, f2) {
    setTimeout(function() {
        f1.call();
        f2.call();
    }, 0);
}
function foo(){
    console.log('foo');
}
function bar(){
    console.log('bar');
}

console.log('異步最先');
async(foo, bar)
console.log('異步完畢');

//打印結果:
//異步最先
//異步完畢
//foo
//bar
    原文作者:UCCs
    原文地址: https://segmentfault.com/a/1190000015200837
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞