我刚刚开始使用Bluebird' Promise.coroutine,这是来自ES6的Generator functions的承诺版本。
创建函数并将其放入变量时,一切正常。像:
let success = Promise.coroutine(function* (_context) {
...
});
exports.success = Promise.coroutine(function* (_context) {
...
});
但是当我尝试创建一个独立的功能时。像:
Promise.coroutine(function *success() {
...
});
它从未定义函数,我收到错误:
未定义成功
如何访问独立的生成器功能?或者更直接,如何创造它?
修改
我使用的是validatejs,它需要异步验证的成功和错误函数:
exports.create = function (req, res) {
var constraints = {
...
}
validate.async(req, constraints).then(Promise.coroutine(success), Promise.coroutine(error));
function success() { //generator
}
function error(e) { //generator
}
}
答案 0 :(得分:1)
您可以定义生成器功能,如下所示。
function* functionName([param[, param[, ... param]]]) {
statements..
}
请注意,符号*带有功能,而不是功能名称。声明函数关键字后跟星号定义生成器函数。
Update1:使用Promise.coroutine方法。在javascript中,函数是一等公民,因此可以作为参数传递。因此,您可以使用functionname替换函数表达式。
Promise.coroutine(functionName);
答案 1 :(得分:0)
您的success()
函数不必命名,因为您实际上没有调用它,而是调用协程Promise。请参阅下面的示例。你应该将你的协程分配给你试图从中调用它的任何东西,然后为你的延迟处理产生一个Promise(无论可能是什么)。然后你需要调用协同返回诺言的协程。
var Promise = require("bluebird");
function Test() {
}
Test.prototype.foo = Promise.coroutine(function* success() {
console.log("Called success")
var i = 0;
while (i < 3) {
console.log("Waiting and Yield " + i++);
yield Promise.delay(1000);
}
console.log("Test " + i);
});
var a = new Test();
a.foo();
console.log("Done!");
然后你会得到这个输出:
>node index.js
Called success
Waiting and Yield 0
Done!
Waiting and Yield 1
Waiting and Yield 2
Test 3