0

我正在使用 Google Sheets 编写公式gapi.update,然后立即调用函数 makeApiCall,尝试从该单元格中检索数据,使用gapi.get.

此检索查询的第一次迭代几乎不可避免地返回undefined,因为公式没有及时处理请求。

我尝试制作一个 for 循环来重复请求,相比之下!==null,此循环在检索单个响应之前执行 4 次迭代。但是,所需的值通常会在第二次查询后返回到控制台。我还尝试用时间延迟来重写它,这似乎并没有真正休眠,它们只是延迟显示数据。我还尝试使用异步函数 + await + return 进行重写,并设法等待返回未定义但不循环所需数据。

有没有一种简单的方法来延迟请求。还是awit在每个之间?

async function makeApiCall(pos) {
  var params = {
    spreadsheetId: 'GoogleSpreadsheetID',
    range: 'Sheet1!B1',
  };

  var i;
  for (i = 0; i < 4; i++) {
    var request = gapi.client.sheets.spreadsheets.values.get(params);
    request.then(function(response) {
      dataOu = (response.result.values);
      if (dataOu.value !== null) {
        displayRes(pos)
      }
    });

  }

我的预期结果是我的全局变量从公式中dataOu检索,如果不是,它应该重复查询。>null有没有办法将其编写为适当的异步函数,如果未收到所需的响应,则在该函数中重复请求。或在 for 循环迭代之间建立计时器的方法。这不是一个简单的异步调用,因为它不只是等待响应,而是要检索特定响应。

4

1 回答 1

1

是的,这应该很容易实现await

async function makeApiCall(pos) {
    const params = {
        spreadsheetId: 'GoogleSpreadsheetID',  
        range: 'Sheet1!B1',  
    };

    let response = await gapi.client.sheets.spreadsheets.values.get(params);
    while (response.result.values == null) { // or whatever you need to check
        await new Promise(resolve => setTimeout(resolve, 5)); // delay the loop a bit
        response = await gapi.client.sheets.spreadsheets.values.get(params); // try again
    }
    const dataOu = (response.result.values);
    if (dataOu.value !== null) {
        displayRes(pos);
    }
}
于 2019-07-31T09:32:54.953 回答