async和await是ES7的提案。
很多第三方庫將它實現(xiàn)成了yield+promise的語法糖的形式。
然而,他們本質(zhì)上卻只需要依賴yield就夠了, promise只是一種用法。
(1)async和await
async function say(greeting){
return new Promise(function(resolve,then){
setTimeout(function(){
resolve(greeting);
},1500);
});
}
(async function(){
var v1=await say('Hello');
console.log(v1);
var v2=await say('World');
console.log(v2);
}());
(2)yield+promise的語法糖
用例:
yieldPromise(function*(){
var v1=yield new Promise(function(resolve,reject){
setTimeout(function(){
resolve('Hello');
},1500);
});
console.warn(v1);
var v2=yield new Promise(function(resolve,reject){
setTimeout(function(){
resolve('World');
},1500);
});
console.warn(v2);
});
實現(xiàn):
function yieldPromise(generator){
var iterator=generator();
recursiveCore.call(iterator);
}
function recursiveCore(feedback){
var iterator=this,
result=iterator.next(feedback);
if(result.done){
return;
}
var promise=result.value;
Promise.resolve(promise).then(function(v){
recursiveCore.call(iterator,v);
});
}
這個在Chrome中是可以運(yùn)行的。
(3)核心是yield
即,用yield實現(xiàn)call/cc
用例:
yieldContinuation(function*(){
var v1=yield function(k){
setTimeout(function(){
k('Hello');
},1500);
};
console.warn(v1);
var v2=yield function(k){
setTimeout(function(){
k('World');
},1500);
};
console.warn(v2);
});
實現(xiàn)方法:
function yieldContinuation(generator){
var iterator=generator();
recursiveCore.call(iterator);
}
function recursiveCore(feedback){
var iterator=this,
result=iterator.next(feedback);
if(result.done){
return;
}
varyieldFunc=result.value;
yieldFunc(function(v){
recursiveCore.call(iterator,v);
});
}
這個在Chrome中是也可以運(yùn)行的。
(4)用promise的寫法
yieldContinuation(function*(){
var v1=yield function(k){
new Promise(function(resolve,reject){
setTimeout(function(){
resolve('Hello');
},1500);
}).then(k);
};
console.warn(v1);
var v2=yield function(k){
new Promise(function(resolve,reject){
setTimeout(function(){
resolve('World');
},1500);
}).then(k);
};
console.warn(v2);
});
這個當(dāng)然必須也是可以運(yùn)行的了。
(5)用其他異步回調(diào)函數(shù)的寫法
如ajax
yieldContinuation(function*(){
var v1=yield function(k){
sendAjax({
url:'/',
success:k
});
};
console.warn(v1);
var v2=yield function(k){
sendAjax({
url:'/',
success:k
});
};
console.warn(v2);
});
這個在實現(xiàn)了sendAjax后,當(dāng)然也是可以運(yùn)行的。