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更有意义。