Babel转换 - 异步到模块方法到Bluebird与ES6地图

时间:2016-09-13 06:56:31

标签: node.js ecmascript-6 babeljs bluebird

我们尝试将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时,一切正常

1 个答案:

答案 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的函数。