名为

时间:2016-12-15 19:12:10

标签: javascript node.js ecmascript-6 bluebird

我刚刚开始使用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
    }
}

2 个答案:

答案 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
相关问题