蓝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
语句等待解决的承诺,实际的yield
expression式将被评估为已解决的值。
在你的情况下,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的数据。