1 回答

TA貢獻(xiàn)1765條經(jīng)驗 獲得超5個贊
“對象”是一種異步方法
這種說法,本身是有問題的。 Promise 只是工具,只能說形式上是“回調(diào)”,形式上是“異步”(確定的同步環(huán)境,不用 return 而用 callback 找虐的人應(yīng)該沒有吧),執(zhí)行是到底是不是“異步”,不一定的。
我們把“異步”與“異步形式”分開來說。
一般說的“異步”是指有上下文切換的場景,比較 setTimeout ,就是很典型的,可以簡單理解為,代碼執(zhí)行到這里之后,就切換到其它地方了,然后后面某個時刻,又可能切換回來。(細(xì)節(jié)一兩句話講不清楚,流程上是這樣)
“異步形式”一般來說,就是“回調(diào)”,從形式上來看,這就是異步與同步的區(qū)別,同步的函數(shù),是 return ,異步的函數(shù),需要傳遞一個 callback ( Promise 之類的語法糖就不說了),然后在函數(shù)里顯式調(diào)用 callback 作用“返回”。
比如一個函數(shù),同步形式:
function syncFunc(){
return "Hello";
}
異步形式:
function asyncFunc(callback) {
callback("Hello");
}
這很容易理解吧。
注意,我們上面說的,“異步形式”,重點是“形式”,與真正的是不是“異步”的流程,實際上是沒有必然聯(lián)系的。比如上面的代碼例子, syncFunc 和 asyncFunc 只是形式上不同,但是,這兩個函數(shù)都不涉及上下文切換,所以,這里沒有真正的“異步”的。
function realAsyncFunc(callback) {
setTimeout(function(){callback('Hello')}, 10 * 1000)
}
這是真正的異步函數(shù)了,因為:
realAsyncFunc(aFunc);
這樣調(diào)用之后,代碼會繼續(xù)執(zhí)行,等到 10 秒之后,又切回來執(zhí)行回調(diào)函數(shù)。
反正,重點是理解 上下文 這個概念。(跟 this 的那個 context 指的不是一個東西,別搞混了),不理解的話,就多從形式上去看吧。
回到 Promise ,這套 API 形式上是“回調(diào)”的,所以,我們可以說它形式上“異步”的,但是實際執(zhí)行是到底是不是異步,這個不一定,看你用在什么地方啦。(與前面的 asyncFunc一個道理)
添加回答
舉報