gpt4 book ai didi

node.js - 如何从云函数调用同步子函数

转载 作者:太空宇宙 更新时间:2023-11-03 21:51:59 24 4
gpt4 key购买 nike

我想同步运行我的所有函数。但是,如果我执行类似下面的代码的内容,则会在分配返回值之前发回响应。

index.js

exports.cfTest = (req, res) => {
try {
result = columnCount(
'project','dataset','table'
);
console.log('sending response');
res.send('<OUTPUT>' + result + '</OUTPUT>');
} catch (err) {
res.status(500).send('<ERROR>' + err + '</ERROR>');
}
};

function columnCount(projectId, bqDataset, bqTable) {

const BigQuery = require('@google-cloud/bigquery');
const bigquery = new BigQuery({projectId: projectId});

var result;

bigquery
.dataset(bqDataset)
.table(bqTable)
.get()
.then(results => {
result = results[1].schema.fields.length;
})
.catch(err => {
result = null;
});

console.log('returning ' + result);
return result;
}

即控制台输出将类似于:

<OUTPUT>undefined</OUTPUT> 

并且在 Stackdriver 日志中将显示如下执行顺序:

 2018-07-25 10:00:00 - Function execution started
2018-07-25 10:00:01 - sending response
2018-07-25 10:00:02 - Function execution took 2000 ms, finished with status code: 200
2018-07-25 10:00:03 - returning 5

这是将执行锁定为仅同步行为的优雅方法吗?

解决方案

下面 Alexandru 建议的异步/等待方法有效!谢谢亚历山德鲁。

注意:但是不适用于标准/GA 云功能。您必须使用Google Cloud Functions Node.js v8 Beta

最佳答案

是的,你可以看看async/await

你的代码最终看起来像这样:

async function columnCount(projectId, bqDataset, bqTable) {
const BigQuery = require('@google-cloud/bigquery');
const bigquery = new BigQuery({ projectId: projectId });

try {
let results = await bigquery
.dataset(bqDataset)
.table(bqTable)
.get();

return results[1].schema.fields.length;
} catch (err) {
return null;
}
}

在第二个

exports.cfTest = async (req, res) => {
try {
result = await columnCount(
'project','dataset','table'
);
console.log('sending response');
res.send('<OUTPUT>' + result + '</OUTPUT>');
} catch (err) {
res.status(500).send('<ERROR>' + err + '</ERROR>');
}
};

关于node.js - 如何从云函数调用同步子函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51518817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com