将参数传递给生成器函数

时间:2016-12-21 17:54:36

标签: javascript node.js ecmascript-6 generator bluebird

过去几个小时我一直坚持这个。

如何将参数传递给生成器函数?

function* getFoo(foo) {
    return yield Promise.resolve(foo + 10);
}

exports.testRoute = Promise.coroutine(function* (req, res) {
    let bar = yield Promise.coroutine(getFoo);  // <--- how to pass argument??
    res.send(bar.toString());
});

当前代码抛出错误(我知道它指向here,但它没有说明参数传递的内容):

Unhandled rejection TypeError: A value [object Promise] was yielded that could not be treated as a promise
    See http:// goo.gl/4Y4pDk
From coroutine:
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:111:17)

如果我这样做:

let bar = yield Promise.coroutine(getFoo(5));

我得到以下错误(再次出现自解释错误,但是this link也没有解释参数传递):

Unhandled rejection TypeError: generatorFunction must be a function
    See http:// goo.gl/6Vqhm0
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:107:15)

1 个答案:

答案 0 :(得分:1)

我相信你想要的是:

function* getFoo(foo) {
    return yield Promise.resolve(foo + 10);
}

exports.testRoute = Promise.coroutine(function* (req, res) {
    let bar = yield Promise.coroutine(getFoo)(50);
    res.send(bar.toString());
});

您需要了解Promise.coroutine的作用。它需要一个生成器,它返回一个返回promise的函数。

正如您在第一种情况(yield Promise.coroutine(getFoo);)中看到的那样,您正在产生Promise.coroutine的结果,这是一个函数,而不是一个承诺,这会导致错误:

A value [object Promise] was yielded that could not be treated as a promise

在第二种情况下(yield Promise.coroutine(getFoo(5));),您只是启动您的生成器。 getFoo(5)返回&#34;生成器&#34;对象但Promise.coroutine需要&#34;生成器函数&#34;,结果为:generatorFunction must be a function

事实上bluebird正在显示Promise.coroutine的结果,因为[object Promise]会给混乱带来很大的影响,因为Promise.coroutine应该返回一个函数,但我无法弄明白。我想你可以把它作为另一个问题。