看一个经典ajax回调的例子:
function foo(x, y, cb) {
ajax(
"http://some.url.1/?x=" + x + "&y=" + y,
cb
);
}
foo(11, 31, function(err, text) {
if(err) {
console.error(err);
}
else {
console.log(text);
}
});
// 异步请求some.url.1参数为x =11, y=31的数据.
// 请求 成功/失败 将数据打印到控制台
下面介绍一个异步迭代生成器…一开始可能会有点怪…但是它引用方便、有很大的扩展空间
// 我们想调用的时候(向调用同步函数那样)顺序调用.
// 它可能会报错,于是丢到try...catch块中
function *main(){
try{
var text = yield foo(11, 31);
console.log(text);
}
catch(err){
console.error(err);
}
}
// 下面定义foo函数
function foo(x, y) {
ajax(
"http://some.url.1/?x=" + x + "&y=" + y,
function(err, data) {
if(err) {
it.throw(err);
}
else{
it.next(data);
}
}
);
}
// foo函数,请求数据,若出错,将信息抛出,若成功则调用next(data)
// 启动
var it = main();
it.next();
Promise实现上面的方法:
function foo(x, y) {
return request(
"http://some.url.1/?x=" + x + "&y=" + y
);
}
foo(11, 31)
.then(
function(text) {
cosnole.log(text);
},
function(err) {
console.error(err);
}
);
把支持Promise的foo和生成器*main()放在一起:
function foo(x, y) {
return request(
"http://some.url.1/?x=" + x + "&y=" + y
);
}
function *mian(){
try{
var text = yield foo(11, 31);
console.log(text);
}
catch(err){
console.err(err);
}
}
// 调用
var it = main();
var p = it.next().value;
p.then(
function(text) {
it.next(text);
},
function(err){
it.throw(err);
}
);
参考《你不知道的JavaScript》(中卷)P250