Javascript 所产生的价值不能视为承诺 我用膝关节炎和蓝知更鸟,正在尝试协同工作。我发现下面的内容给了我一个错误。但是,如果我用initRouters的内容替换initRouters,它就会工作。为什么呢 'use strict'; const fs = require('fs'); const Promise = require('bluebird'); const readdir = Promise.promisify(fs.readdir); let app = require('koa')(); let initRouters = function *() { const routerDir = `${__dirname}/routers`; let routerFiles = yield readdir(routerDir); return Promise.map(routerFiles, function *(file) { var router = require(`${routerDir}/${file}`); app .use(router.routes()) .use(router.allowedMethods()); }); } Promise.coroutine(function *() { yield initRouters(); const PORT = process.env.PORT || 8000; app.listen(PORT); console.log(`Server listening on ${PORT}`); })();

Javascript 所产生的价值不能视为承诺 我用膝关节炎和蓝知更鸟,正在尝试协同工作。我发现下面的内容给了我一个错误。但是,如果我用initRouters的内容替换initRouters,它就会工作。为什么呢 'use strict'; const fs = require('fs'); const Promise = require('bluebird'); const readdir = Promise.promisify(fs.readdir); let app = require('koa')(); let initRouters = function *() { const routerDir = `${__dirname}/routers`; let routerFiles = yield readdir(routerDir); return Promise.map(routerFiles, function *(file) { var router = require(`${routerDir}/${file}`); app .use(router.routes()) .use(router.allowedMethods()); }); } Promise.coroutine(function *() { yield initRouters(); const PORT = process.env.PORT || 8000; app.listen(PORT); console.log(`Server listening on ${PORT}`); })();,javascript,ecmascript-6,bluebird,koa,Javascript,Ecmascript 6,Bluebird,Koa,我得到的错误是 Unhandled rejection TypeError: A value [object Generator] was yielded that could not be treated as a promise See http://goo.gl/MqrFmX From coroutine: at Function.Promise.coroutine (/home/jiewmeng/Dropbox/expenses-app/node_modules/bl

我得到的错误是

Unhandled rejection TypeError: A value [object Generator] was yielded that could not be treated as a promise

    See http://goo.gl/MqrFmX

From coroutine:
    at Function.Promise.coroutine (/home/jiewmeng/Dropbox/expenses-app/node_modules/bluebird/js/release/generators.js:176:17)
    at Object.<anonymous> (/home/jiewmeng/Dropbox/expenses-app/src/app.js:21:9)
    at PromiseSpawn._continue (/home/jiewmeng/Dropbox/expenses-app/node_modules/bluebird/js/release/generators.js:145:21)
    at PromiseSpawn._promiseFulfilled (/home/jiewmeng/Dropbox/expenses-app/node_modules/bluebird/js/release/generators.js:92:10)
    at /home/jiewmeng/Dropbox/expenses-app/node_modules/bluebird/js/release/generators.js:183:15
    at Object.<anonymous> (/home/jiewmeng/Dropbox/expenses-app/src/app.js:27:3)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:141:18)
    at node.js:933:3
你遇到了鸡蛋/鸡的问题

让我们给你一个承诺:

返回一个函数,该函数可以使用yield来生成承诺

这里的问题是,你试图产生一个生成函数,而不是一个承诺。这将导致以下错误:

未处理的拒绝类型错误:生成的值[object Generator]不能被视为承诺

为什么?

生成器函数返回一个承诺,但只有当你给出它时,它才是一个承诺。因为你不能产生一个生成函数,你永远也得不到承诺的值

您可以而且应该使用协同路由和路由器;。但是,这应该是一个正常的函数,返回一个承诺,而不是一个生成器函数

作为补充说明,您不需要Promise.map,因为您在.map中所做的一切都是同步的,因此您可以完美地执行以下操作:

let initRouters = function() {
  const routerDir = `${__dirname}/routers`;

  return readdir(routerDir).then(function (files) {
    files.map(function (file) {
      var router = require(`${routerDir}/${file}`);

      app
        .use(router.routes())
        .use(router.allowedMethods());
    })
  })
}
在这里,你返回了一个承诺,当你放弃它时,这个承诺就会得到解决。但正如您所看到的,您已经返回了一个承诺,这就是为什么promise.coroutine不会给您任何错误。在发电机的情况下,您没有返回承诺。

您遇到了鸡蛋/鸡的问题

让我们给你一个承诺:

返回一个函数,该函数可以使用yield来生成承诺

这里的问题是,你试图产生一个生成函数,而不是一个承诺。这将导致以下错误:

未处理的拒绝类型错误:生成的值[object Generator]不能被视为承诺

为什么?

生成器函数返回一个承诺,但只有当你给出它时,它才是一个承诺。因为你不能产生一个生成函数,你永远也得不到承诺的值

您可以而且应该使用协同路由和路由器;。但是,这应该是一个正常的函数,返回一个承诺,而不是一个生成器函数

作为补充说明,您不需要Promise.map,因为您在.map中所做的一切都是同步的,因此您可以完美地执行以下操作:

let initRouters = function() {
  const routerDir = `${__dirname}/routers`;

  return readdir(routerDir).then(function (files) {
    files.map(function (file) {
      var router = require(`${routerDir}/${file}`);

      app
        .use(router.routes())
        .use(router.allowedMethods());
    })
  })
}
在这里,你返回了一个承诺,当你放弃它时,这个承诺就会得到解决。但正如您所看到的,您已经返回了一个承诺,这就是为什么promise.coroutine不会给您任何错误。对于生成器,您没有返回承诺。

initRouters返回生成器。您不能让它成为Promise.coroutine,它只允许您在错误明确指示的情况下做出承诺

您要么需要将initRouter包装在Promise.coroutine中,要么使用

yield* initRouters();
因此,所有来自发电机的承诺都会兑现,而不是发电机本身。请注意,与Bluebird不同,co库确实允许这种怪癖。

initroutes返回一个生成器。您不能让它成为Promise.coroutine,它只允许您在错误明确指示的情况下做出承诺

您要么需要将initRouter包装在Promise.coroutine中,要么使用

yield* initRouters();

因此,所有来自发电机的承诺都会兑现,而不是发电机本身。请注意,co库确实允许这种怪癖,与Bluebird不同。

我认为您需要在Promise中封装initRouters生成器函数。协同路由和initRouters尝试生成Promise.map调用而不是返回。我认为您需要在Promise中封装initRouters生成器函数。协同路由和initRouters尝试生成Promise.map调用而不是返回另一方面,我将使用files.forEach而不是files.map,因为您没有转换数组;你造成了副作用,正因为如此,forEach更有意义;你正在造成副作用,正因为如此,forEach更有意义。