看一个经典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