如何等待 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
代替 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)
}
})
}
参考文献:
我的解决方案:
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;
}
}
}
}
要从 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
代替 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)
}
})
}
参考文献:
我的解决方案:
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;
}
}
}
}