搜尋

首頁  >  問答  >  主體

javascript - 關於你不知道的js中產生器函數並發的問題

我在書上看見這樣的程式碼,程式碼的目的是同時發起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);
});

這是我簡化的程式碼,去掉了控制轉移,這樣做相比原來會有什麼隱患呢

为情所困为情所困2766 天前678

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-06-12 09:33:03

    個人覺得書上的程式碼之所以這麼囉嗦,只是為了確保得到data陣列的順序。
    相反,你簡化的程式碼很優雅啊,簡單乾淨利索。 。 。

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:33:03

    就是取得資料之後再次暫停generator,等待統一記錄到數組,控制了寫入數組的順序。

    你改寫的版本 Promise.all 裡的程式碼沒用。

    回覆
    0
  • 取消回覆