node.js - 如何等待谷歌电子表格调用并将其设置在 for 循环中
问题描述
要从谷歌电子表格中获取行,此代码将起作用:
this.sheetsService.spreadsheets.values.get({
spreadsheetId,
range,
}, (err, result) => {
if (err) {
// Handle error
console.log(err);
} else {
const numRows = result.values ? result.values.length : 0;
console.log(`${numRows} rows retrieved.`);
//Here I can use my rows
}
});
但是我怎么能等待这个功能完成呢?例子:
console.log("1");
this.sheetsService.spreadsheets.values.get({
spreadsheetId,
range,
}, (err, result) => {
if (err) {
// Handle error
console.log(err);
} else {
console.log("2");
}
});
console.log("3");
这很可能会打印 132。还有没有办法在当前范围之外获得结果和错误?
我可能的意思的伪代码(应该打印 123):
console.log("1"); //Print 1
var getRows = this.sheetsService.spreadsheets.values.get({
spreadsheetId,
range,
}
console.log("2"); //Print 2
if (getRows.err) {
// Handle error
console.log(getRows.err);
} else {
const numRows = getRows.result.values ? getRows.result.values.length : 0;
console.log(`${numRows} rows retrieved.`);
console.log("3") //Print 3
}
编辑:我希望错误超出范围,所以我可以这样做:(如果工作表调用失败,代码为 429,程序将休眠 100sek 并再次尝试)伪代码:
for(var i = 1; i < 5; i++){
var getRows = this.sheetsService.spreadsheets.values.get({
spreadsheetId,
range,
}
console.log("2"); //Print 2
if (getRows.err) {
// Handle error
if(getRows.err.code === 429){
console.log("Too many requests, try again in 100sek");
await sleep(100000); //sleep function with 100sek
continue
}
//Some other code here
} else {
//logic for the results
console.log("3") //Print 3
}
console.log("Finished");
}
所以 123 将被正确打印,如果调用失败,它将在 100sek 后重试,最多 5 次尝试。
解决方案
您可以使用promises
代替callbacks
或async/await
:
片段:
console.log("1");
var i = 0;
function loop(){
if( ++i > 5 ) return;
this.sheetsService.spreadsheets.values.get({
spreadsheetId,
range,
})
.then(result => {
console.log(result);
console.log("2");
})
.then(()=>console.log("3"))
.catch(err=>{
console.log(err);
if(err.code === 429){
sleep(100000).then(loop)
}
})
}
参考:
推荐阅读
- powershell - 在 TFVC for TFS 2017 中签入代码时用于关联工作项的命令是什么?
- python - 先知.perdict(future) ValueError 不能传递任何大小的future(df)
- python - python链接列表首先删除
- r - 为列表中的数据框编号(即,为每个数据框创建一个带有单独编号的列)
- php - 如何计算负/正时间和大于 24:00?
- java - 首次在新环境中运行 Spring Boot 应用程序时如何运行 data.sql 脚本?
- go - 互斥锁的golang实现中是否存在竞争条件,m.state是在没有原子函数的情况下读取的
- html - 段落不居中,但父元素是
- javascript - Apple iOS 浏览器随机不会呈现动态加载的 HTML 对象
- protractor - 鼠标在量角器中的元素上移动