Promise
promise墜落現(xiàn)象
Promise.resolve('foo').then(Promise.resolve('bar')).then(res=>{
console.log(res)
})
<!-- log 'foo' -->
以上輸出為
foo
.會(huì)很奇怪Promise的then方法的參數(shù)期望是函數(shù)涧窒,傳入非函數(shù)則會(huì)發(fā)生值穿透空入。
因?yàn)榻o
then方法傳遞了一個(gè)非函數(shù)(比如promise對(duì)象)的值
代碼會(huì)理解為then(null)
, 因此導(dǎo)致前一個(gè)promise的結(jié)果產(chǎn)生了墜落的效果-
更新
Promise.resolve('foo').then(()=>{ return Promise.resolve('bar') }).then(res=>{ console.log(res) }) <!-- log 'bar' -->
與 setTimeout 執(zhí)行順序
setTimeout(()=>{
console.log('setTimeout')
})
let p1 = new Promise((resolve)=>{
console.log('Promise1')
resolve('Promise2')
})
p1.then((res)=>{
console.log(res)
})
console.log(1)
<!-- log `1 , Promise1 , Promise2 , setTimeout` -->
實(shí)現(xiàn)簡(jiǎn)單的 Promise
function Promise(fn){
var status = 'pending';
function successNotify(){
status = 'fulfilled'
toDoThen.apply(undefined, arguments);
}
function failNotify(){
status = 'rejected'
toDoThen.apply(undefined, arguments);
}
function toDoThen(){
setTimeout(()=>{
if(status === 'fulfilled'){
for(let i = 0; i < successArray.length; i++){
successArray[i].apply(undefined, arguments)
}
}
if(status === 'rejected'){
for(let i = 0; i < failArray.length; i++){
failArray[i].apply(undefined, arguments)
}
}
})
}
var successArray = [];
var failArray = [];
fn.call(undefined,successArray,failArray);
return {
then: function(successFn,failFn){
successArray.push(successFn);
failArray.push(failFn);
return undefined;
}
}
}