我在書上看見這樣的程式碼,程式碼的目的是同時發起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 裡的程式碼沒用。