Javascript 将参数传递给生成器函数

Javascript 将参数传递给生成器函数,javascript,node.js,ecmascript-6,generator,bluebird,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??

在过去的几个小时里,我一直在做这件事

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

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());
});
如果我这样做:

let bar = yield Promise.coroutine(getFoo(5));
我得到以下错误(同样是自解释错误,但也不能解释参数传递):


我相信你想要的是:

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());
});
你需要明白什么能起作用。它接受一个生成器并返回一个函数,该函数返回一个承诺

正如您在第一种情况中所看到的(
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)
返回一个“generator”对象,但
Promise。coroutine
需要一个“generator函数”,这导致:
generatorFunction必须是一个函数


事实上,bluebird将Promise.coroutine的结果显示为
[object Promise]
,这造成了很大的混乱,因为Promise.coroutine应该返回一个函数,但我无法理解。我想你可以问另一个问题。

我可能误解了上下文,但你不能只做
产生承诺。协同程序(getFoo.bind(null,5))
?@LINKIWI-nope,我得到的第一个错误是产生了一个值[对象承诺]…是的,最近才发现。没想到会这么简单。嗯,我想这是因为蓝鸟希望在
yield
关键字旁边有一个
Promise
(正如你所看到的,我已经将我的
testRouter
包装成
Promise.coroutine
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());
});
A value [object Promise] was yielded that could not be treated as a promise