javascript - 谷歌云功能:为什么这不起作用?
问题描述
我从使用 NodeJs 8 的 Google Cloud Functions 开始。(我也是 NodeJS 的新手,但不是 javascript)在浏览文档、github 上的示例、“旧”文章时我有点迷失了这个主题,我很沮丧无法取得一些体面的进展。
我的问题是:如果您能解释一下为什么某些语法不起作用:)
以下是目前让我感到困惑的一些事情:
- 我在 github 或 Google Cloud 文档上找到的示例,只是不工作 OOTB
此语法不适用于 Google Cloud Functions:您必须删除花括号才能使其正常工作。
取自此文档:https ://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/Publisher
const {PubSub} = require('@google-cloud/pubsub');
- NodeJS8 应该支持我在 Github 上找到的示例中使用的async关键字,当我保存我的函数时出现语法错误,而选择了 Node8。
示例示例:https ://github.com/googleapis/nodejs-bigquery/blob/master/samples/tables.js
- 我可以发现两种类型的语法,一种带有回调,一种带有承诺链。
在同一个文档中,我阅读了回调技术:
https://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/Publisher
publisher.publish(data, attributes, callback);
我还看到了一些具有“承诺链”技术的其他语法:
https://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/
publisher.publish(data).then().catch()
两种方法都有效吗?我不明白为什么在“承诺链”可用的情况下支持回调?哪个最好用?(向后兼容?)
解决方案
我不确定问题来自“过时”或“错误”的文档,我相信问题来自其他地方。
1.解构(变量中的大括号)引发语法错误
我刚刚在 Node.js 8 Cloud Function 中自己尝试了您的示例,它正在工作。将 PubSub 库添加到 Cloud Function package.json 中,将您共享的行添加到代码中,并且可以正常工作。
您可以添加您收到的错误消息或尝试完全创建一个新的 Cloud Functions,因为您共享的语法绝对可以在 Cloud Functions 中使用。另外,尝试更简单的解构代码并检查它是否有效,例如:
exports.destructuringTest = (data, context) => {
const complexObject = {simpleObject: "Hello"};
const {simpleObject} = complexObject;
console.log(simpleObject); // You should see "Hello" in the CF logs
};
2. 使用async关键字会引发语法错误
很奇怪,和第一个问题一样,我可以用我的async
作品。我建议和以前一样,分享完整的错误消息,创建一个新的 Cloud Function 并尝试一个更简单的示例。我的云函数使用了这个:
exports.asyncTest= (data, context) => {
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result); // expected output: 'resolved'
}
asyncCall();
};
同样,在这种情况下您会收到语法错误,这很奇怪。如果我的建议不起作用,请尝试创建一个新项目(如果可能的话)并在那里测试示例。如果问题仍然存在,我的建议是使用Google 的问题跟踪器创建一个新问题,解释您的云功能发生了什么
3. 为什么有“promise chain”可用的回调支持?两种方法都有效吗?
该publish
方法允许将回调函数作为参数传递。如果您不传递回调函数,该方法会自动返回一个 Promise,所以是的,两种调用该方法的方式都有效。
另一个问题更像是“回调与承诺”的问题。这总是一个有趣的话题,但简要总结一下,promise 和 callbacks 不能直接互换。Promise 的作用比回调要好得多,但不如回调更适合通用目的。这是一篇关于回调和承诺的非常好的文章。
推荐阅读
- three.js - Three.js:闪烁的四边形(不在同一个 z 平面上)
- ruby-on-rails - Prawn::Errors::CannotFit: 表格的宽度设置得太小而无法包含其内容
- azure - 未指定目标存储位置的 Uri。请考虑更改请求的位置模式
- c# - 将excel数据直接读入gridview,一列显示255个以上字符的完整数据
- angular - 一个完整的 observable 会发生什么?如果我订阅了一个完整的 observable 怎么办?
- swift - 如何在我的游戏中保存用户的等级?
- javascript - 动态添加一列到数据表
- c# - 从日期时间获取周数
- razor - 为什么我的 Razor 代码不能与 ASP.NET Core 中的标记帮助程序一起使用
- node.js - 解决 Angular 项目错误