函數(shù)的副作用
一個函數(shù)除了會返回一個值之外,還會修改函數(shù)以外的狀態(tài)如全局變量等等。
var a = 4;
function change(){
a = 3;
}
change();
console.log(a);//3
promise.all()
Promise.all()會以一個 promises 數(shù)組為輸入,并且返回一個新的 promise。這個新的 promise 會在數(shù)組中所有的 promises 都成功返回后才返回。他是異步版的 for 循環(huán)。一旦數(shù)組中的 promise 任意一個返回錯誤,Promise.all() 也會返回錯誤。并且 Promise.all() 會將執(zhí)行結(jié)果組成的數(shù)組返回到下一個函數(shù)。
忘記使用 .catch()
這是另一個常見的錯誤。單純的堅信自己的 promises 會永遠(yuǎn)不出現(xiàn)異常,很多開發(fā)者會忘記在他們的代碼中添加一個 .catch()。然而不幸的是這也意味著,任何被拋出的異常都會被吃掉,并且你無法在 console 中觀察到他們。這類問題 debug 起來會非常痛苦。
Promise 能被暫停
僅僅因為你已經(jīng)在一個 then() 函數(shù)中執(zhí)行過代碼,并不意味著你不能夠暫停 promise 去做其他事情。為了暫停當(dāng)前的 promise,或者要它等待另一個 promise 完成,只需要簡單地在 then() 函數(shù)中返回另一個 promise。
var = new Promise(/*...*/);
p.then(function(str){
if(!loggedIn){
return new Promise(/*...*/);
}
})
.then(function(str){
alert("Done!");
});
在上面的代碼中,直到新的 promise 的狀態(tài)是 resolved解析后,alert 才會顯示。如果要在已經(jīng)存在的異步代碼中引入更多的依賴,這是一個很便利的方式。例如,你發(fā)現(xiàn)用戶會話已經(jīng)超時了,因此,你可能想要在繼續(xù)執(zhí)行后面的代碼之前發(fā)起第二次登錄。