蓝cor协同使用

我试图使用蓝鸟的协程如下:

var p = require('bluebird'); //this should return a promise resolved to value 'v' var d = p.coroutine(function*(v) { yield p.resolve(v); }); //however this prints 'undefined' d(1).then(function(v){ console.log(v); }); 

这里有什么不正确的?

引用coroutine的文档 ,

返回一个可以使用yield来产生promise的函数。 控制返回到发电机,当承诺的承诺解决。

所以,函数可以利用yield ,但yield并不是用来从函数返回值的。 无论你使用return语句返回的那个函数都是协程函数的实际parsing值。

Promise.coroutine只是让yield语句等待解决的承诺,实际的yieldexpression式将被评估为已解决的值。

在你的情况下,expression式

 yield p.resolve(v); 

将被评估为1 ,因为你没有明确地从函数返回任何东西,默认情况下,JavaScript返回undefined 。 这就是为什么你得到了undefined的结果。


为了解决这个问题,你可以实际返回这个值

 var p = require('bluebird'); var d = p.coroutine(function* (v) { return yield p.resolve(v); }); d(1).then(console.log); 

让我们从你的代码开始:)

 var d = p.coroutine(function*(v) { yield p.resolve(v); }); 

当你做d(1)的时候,蓝鸟的协程是神奇的并且评估了promise函数,例如p.resolve(v)。 现在,协程是如何工作的,就是调用promise函数,然后执行实际收益,也就是说在执行承诺后stream量回到实际的生成器。

现在yield不是用于返回值的,不同于在promise中可以用来获得'then'中的值的parsing函数。

所以没有值返回,因此你得到未定义。

所以你可以做两件事情:

首先明确地返回yield值:

 var d = p.coroutine(function* (v) { return p.resolve(v); }) 

这将返回通过执行promise获得的'yield'中获得的值,因此可以使用'then'获得值。 喜欢

 d(7).then((val) => { console.log(val); }); 

但是如果你有另外一个承诺的function,那么该怎么办呢? 即这样的事情:

 var d = bluebird.coroutine(function* (val) { yield bluebird.resolve(val); console.log('i am here'); yield(bluebird.resolve('here' + val)); console.log('i am at the last'); }); 

那么在这里做返回的事情不会执行另一个yield函数,即如果你在上面的代码中返回第一个yield值,那么在第一个yield之后的代码将不会被执行。

所以我可以做的一件事就是处理那里的那个“那个”

 var d = bluebird.coroutine(function* (val) { yield bluebird.resolve(val).then(function(data) { // process data here console.log(data); }); }); d(4).then(() => { console.log('done execution'); }); 

你可以做任何没有承诺的承诺。 这是一个演示代码:

 var bluebird = require('bluebird'); bluebird.coroutine(function *temp() { console.log('starting'); yield(new Promise((resolve, reject) => { setTimeout(function() { return resolve('first yield data'); }, 2000); }).then((data)=>{console.log(data)})); yield(new Promise((resolve, reject) => { setTimeout(function() { resolve('second yield data'); }, 3000); }).then((data) => {console.log(data)})); })().then(() => { console.log('finally done'); }); 

这样,你可以在bluebird中产生尽可能多的承诺,并在他们各自的“then”中获得由他们解决的值并处理parsing的数据。