我有一个脚本,它从Firebase中读取了大量信息,并then
处理它。这涉及对外部数据源的一些异步调用,我想使用async
和await
。我已经在这个非常npm的项目中成功完成了这项工作,所以我不明白为什么它现在不能正常工作。这是我的.babelrc文件:
{
"presets": ["es2015", "stage-0", "react"],
"plugins": ["syntax-async-functions","transform-regenerator"]
}

这是我的代码的要点:
var config = {
apiKey: "key",
authDomain: "myProject.firebaseapp.com",
databaseURL: "https://myProject.firebaseio.com",
storageBucket: "myProject.appspot.com",
messagingSenderId: "id"
};
Firebase.initializeApp(config);
var dbRef = Firebase.database().ref();
getAllFirebaseDocs(dbRef);
async function getAllFirebaseDocs(dbRef) {
return dbRef.once('value').then(function(snapshot) {
var items = snapshot.val();
for (key in items) {
var priceUrl = "some.url.com"
items[key] = await requestPrices(items[key], priceUrl);
}
}
}

await
行SyntaxError: testScript.js: Unexpected token
失败。还有一堆带有怪异盒子字符的代码,其中包含33m和39m,如下所示:[33m][39m[1m,[22m priceUrl[94m[1m)[22m[39m[1m;[22m
。
我使用babel-node testScript.js
运行脚本。我知道这是有效的,因为我有另一个脚本,我在babel-node
的同一个项目中运行,它有异步部分,工作正常......不确定我在这个中错过了什么。如果重要,babel-node -V
给出v6.4.0。
答案 0 :(得分:2)
您只能在标记为await
的功能中使用async
。在您的情况下,您在一个未标记为此类的函数(回调到.then()
)中运行它。
您可以使用:
return dbRef.once('value').then(async function(snapshot) { ... });
但是既然您已经使用async/await
,那么您也可以将代码改写为:
async function getAllFirebaseDocs(dbRef) {
let snapshot = await dbRef.once('value');
let items = snapshot.val();
for (let key in items) {
let priceUrl = "some.url.com"
items[key] = await requestPrices(items[key], priceUrl);
}
// I assume that you want to return `items`; your original code doesn't return anything.
return items;
}