2016-09-19 57 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

相关问题