我们尝试将Node.js 6.5.0与Babel
一起使用,以async functions
使用Bluebird
而非本机V8 ES6承诺:
我们的package.json
仅包含以下Babel
个条目:
"devDependencies": {
"babel-cli": "^6.9.0",
"babel-plugin-transform-async-to-module-method": "^6.8.0",
"babel-plugin-transform-es2015-destructuring": "^6.9.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.14.0",
}
和.babelrc
:
{
"plugins": [
"transform-es2015-modules-commonjs",
"transform-es2015-destructuring",
[
"transform-async-to-module-method",
{
"module": "bluebird",
"method": "coroutine"
}
]
]
}
但是,我们async functions
返回的ES6映射会在执行期间导致以下错误:
产生的值[object Map]不能被视为承诺
我们如何解决这个问题?
P.S。使用async functions
generators
转换为transform-async-to-generator
时,一切正常
答案 0 :(得分:2)
以下是一些触发相同错误的示例代码:
>>> all = list(set([j for i in list(d.keys()) for j in list(d[i].keys())]))
>>> all
['transfer', 'tahu', 'transaksi', 'individu', 'manajemen', 'logistik']
>>> for k in all:
for j in list(d.keys()):
if not k in d[j].keys():
d[j][k]=0
>>> d
{'doc0': {'individu': 1,
'logistik': 1,
'manajemen': 1,
'tahu': 1,
'transaksi': 1,
'transfer': 0},
'doc1': {'individu': 1,
'logistik': 1,
'manajemen': 1,
'tahu': 1,
'transaksi': 1,
'transfer': 1},
'doc2': {'individu': 0,
'logistik': 1,
'manajemen': 1,
'tahu': 0,
'transaksi': 1,
'transfer': 0}}
请注意,function giveMap() {
return new Map();
}
void async function() {
await giveMap();
}();
未标记giveMap
(这是实际问题)。
此代码将在使用async
时运行,因为transform-async-to-generator
可从发布者处获得:
Map
但是,使用function* () {
yield new Map();
}
时,我认为代码与此类似:
transform-async-to-module-method
这将导致错误as explained here,因为Promise.coroutine(function* () {
yield new Map();
});
期望得到承诺。
因此,您应该留意返回Promise.coroutine()
,Map
已开启但未映射await
的函数。