2016-09-19 18 views
0

我正在爲我的數據庫創建種子數據。種子的功能是聯合包裹發生器(https://www.npmjs.com/package/co):並行化包含co包裝生成器的Promise的執行

createSeedData() { 
    co(function *() { 
    [...] 
    } 
} 

在一個點上,我試圖創建40次拍賣每一個投標。 到現在爲止我有一個for循環是這樣的:

for (let i = 0; i <= 40; i++) { 
    let auction = yield auction.create({ 
    [...] 
    }) // Async creation of model and persisting it in db 
    yield bid.create({ 
    auction: auction.id 
    [...] 
    }) 
} 

現在我想創建並行拍賣,但我不能完全得到它的工作。

co支持與數組一起使用yield時的並行執行。

但是,我仍然需要先創建一個發票,然後使用收益對它進行出價。

我試着在承諾和內部共同包裝的生成器函數中包裝上述內容,但它只是從來沒有完成執行。

我該如何解決這個問題?(如果可能的話,而無需使用多個軟件包)

這裏是我的嘗試與內發電機:

let promises = [] 
for (let i = 0; i <= 40; i++) { 
    promises.push(new Promise(
    co(function *(resolve, reject) { 
     let auction = yield auction.create({ 
     [...] 
     }) // Async creation of model and persisting it in db 

     yield bid.create({ 
     auction: auction.id 
     [...] 
     }) 
    ) 
    resolve() 
)) 
} 
yield invoicePromises 
+0

失信於救援,的確如此!請向我們展示您使用內部發生器的嘗試。另外,'create'返回的是,它是否已經使用promise? – Bergi

+0

@Bergi'create'返回一個Promise。我添加了內部發生器。 – Hedge

回答

1

有沒有需要調用new Promise(和它不工作,因爲你永遠不會調用resolvereject )。只是省略部分,co()已經返回了一個承諾:

let promises = []; 
for (let i = 0; i <= 40; i++) { 
    promises.push(co(function *() { 
    let auction = yield auction.create({ 
     [...] 
    }); // Async creation of model and persisting it in db 
    yield bid.create({ 
     auction: auction.id 
     [...] 
    }); 
)); 
} 
yield invoicePromises; 

如果你不想使用內部生成器,你可以做簡單的承諾的鏈接,以及:

let promises = []; 
for (let i = 0; i <= 40; i++) { 
    promises.push(
    auction.create({ 
     [...] 
    }).then(auction => 
     bid.create({ 
     auction: auction.id 
     [...] 
     }); 
    ) 
); 
} 
yield Promise.all(invoicePromises); 
+0

真棒這個作品。在我的代碼中,我有一個'resolve()',但是沒有明確地添加Promise,它甚至更好。 – Hedge

+0

是的,即使是[反模式](http://stackoverflow.com/q/23803743/1048572),也不必要地介紹它 - 你需要使用'try {...} catch(e){reject(e)}'在發生器中也傳播錯誤 – Bergi

相關問題