如何等待 google 电子表格调用并将其设置在 for 循环中

How to wait for google spreadsheet call and set it inside of a for loop

要从 google 传播sheet 中获取行,此代码将起作用:

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
}

编辑: 我想要范围之外的错误,所以我可以做这样的事情:(如果 sheet 调用失败,代码为 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 代替 callbacksasync/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) 
  }
})
}

参考文献:

我的解决方案:

async function GetData() {
    for (var i = 1; i <= 5; i++) {
        try {
            var data = await this.sheetsService.spreadsheets.values.get({
                spreadsheetId,
                range
            });
            return data;
        } catch (err) {
            if (err.code === 429) {
                console.log("Too many requests, try again in 100sek");
                await sleep(100000); //sleep function with 100sek
                continue;
            }
        }
    }
}