我在书上看见这样的代码,代码的目的是同时发起2个异步的ajax请求,把结果按照顺序push进一个数组中
//假设request是基于primose的ajax工具 var arr = []; function *reqData ( url ) { var data = yield request(url); yield; //关于这一行书上是这样解释的,控制转移 arr.push(data); } var it1 = reqData("http:....1"), it2 = reqData("http:....2"); //总之是2个不同的url地址 var p1 = it1.next(), p2 = it2.next(); p1.then( function(data) { it1.next(data); } ); p2.then( function(data) { it2.next(data); } ); Promise.all([p1, p2]).then( function () { it1.next(); it2.next(); } );
我一直没弄懂控制转移是干什么用的,书上也没多说
var arr = []; function *reqData ( url ) { arr.push( yield request(url) ); }; var it1 = reqData("http:....1"), it2 = reqData("http:....2"); //总之是2个不同的url地址 var p1 = it1.next(), p2 = it2.next(); Promise.all([p1, p2]).then( data => { var [data1, data2] = data; it1.next(data1); it2.next(data2); });
这是我简化的代码,去掉了控制转移,这样做相比原来会有什么隐患呢
个人觉得书上的代码之所以这么啰嗦,只是为了保证得到data数组的顺序。
相反,你简化的代码很优雅啊,简单干净利索。。。
就是获取数据之后再次暂停generator,等待统一记录到数组,控制了写入数组的顺序。
你改写的版本 Promise.all 里的代码没用。