我从使用NodeJ 8的Google Cloud Functions开始。(我也是NodeJS的新手,但不是JavaScript的人) 浏览文档,github上的示例,关于该主题的“旧”文章时,我有些失落,而我无法取得一些体面的进展感到沮丧。
我的问题是:如果您能向我解释为什么某些语法不起作用:)
以下是一些目前困扰我的事情:
此语法不适用于Google Cloud Functions:必须删除花括号以使其起作用。
摘自本文档:https://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/Publisher
const {PubSub} = require('@google-cloud/pubsub');
示例示例: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()
这两种方法都可行吗?我不明白为什么在“承诺链”可用的情况下支持回调?最好使用哪一个? (向后兼容吗?)
答案 0 :(得分:1)
我不确定该问题来自“过时”或“错误”的文档,我认为该问题来自其他地方。
1。 Destructuring(在变量中使用大括号)会引发语法错误
我刚刚在Node.js 8 Cloud Function中尝试了您的示例,并且该示例正在运行。将PubSub库添加到Cloud Function package.json中,将共享的行添加到代码中,并且行得通。
您可以添加接收到的错误消息,或者尝试完全创建一个新的Cloud Function,因为共享的语法绝对可以在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并尝试一个更简单的示例。我的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's Issue Tracker创建一个new issue来解释您的Cloud Functions发生的情况
3。为什么可以使用“承诺链”来支持回调?两种方法都可行吗?
publish
method允许将回调函数作为参数传递。如果不传递回调函数,则该方法会自动返回promise,因此,是的,两种调用该方法的方法都可以使用。
另一个问题更多是“回调与承诺”问题。这始终是一个有趣的话题,但是简短的总结是,promise和回调不能直接互换。关于回调函数,Promise比回调要好得多,但是不像回调那样适合一般用途。 Here's a very good writeup关于回调和承诺。