2

我是一名初學者編碼人員,希望能夠加快我的Google工作表查詢的速度。我環顧四周,找不到解決方案。我試圖快速運行25個查詢到Google工作表,這就是我想要的:使用承諾對Google工作表進行多重查詢

  1. 運行一個查詢到Google工作表。
  2. 將結果推送到數組。
  3. 運行不同的查詢。
  4. 將結果推送到相同的數組。
  5. 運行下一個查詢... x 25.
  6. 繪製最終結果的表格。

問題是,如果我一個接一個地運行quires,他們需要25秒才能完成。如果我在for循環中運行quires,結果會在2秒內返回,但是是異步的,並且數據全是怪事。也許,我應該使用承諾,或其他的東西。請你幫忙。

這裏是用慢版的代碼:

var resultData; 
var allData = []; 
var i = 0; 

function startQuery() { 
    i = 0; 
    allData.length = 0; 
    runOnecode(); 
} 

function runOnecode() { 
    var str = ""; 
    str += $(".google-visualization-controls-rangefilter-thumblabel").text(); 
    var until = str.substring(10); 
    var from = str.substring(0,10); 
    var center = $("#centerSelect option:selected").text(); 
    var query = [ 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND G =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND H =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND I =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND J =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND K =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND N =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND O =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND P =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Q =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND R =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND S =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND T =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND U =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND V =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND W =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND X =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Y =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Z =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AA =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AB =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AC =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AD =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AE =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AF =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AG =\"No\" ") 
    ]; 

    getData(query[i]); 
} 
</script> 
<script> 
function getData(incomingQuery) { 

    // Prepare the query 
    var queryString = encodeURIComponent(incomingQuery); 
    var query = new google.visualization.Query(
    //Collect the data from this spreadsheet 
    'MySpreadSheet URL' + queryString); 
    query.send(handleSampleDataQueryResponse); 

    //Handle any errors from the Google server 
    function handleSampleDataQueryResponse(response) { 
    if (response.isError()) { 
     alert('Error in query: ' + response.getMessage() + ' ' + 
     response.getDetailedMessage()); 
     return; 
    } 

    // get look into the resulting data and find the detail.  
    var datas = response.getDataTable(); 
    if (datas.Gf.length === 0) { 
     resultData = 0; 
    } else resultData = datas.Gf[0].c[0].v; 

    allData.push(resultData); 
    //  console.log(allData); 

    if (i < 25) { 
     runOnecode(); 

    } else { 
     drawTable(); 
    } 
    i++; 
    } 

} 
</script> 

這裏是快速的版本,返回結果異步:

<script> 
function runOnecode() { 
    var str = ""; 
    str += $(".google-visualization-controls-rangefilter-thumblabel").text(); 
    var until = str.substring(10); 
    var from = str.substring(0,10); 
    var center = $("#centerSelect option:selected").text(); 
    var query = [ 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND G =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND H =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND I =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND J =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND K =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND N =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND O =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND P =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Q =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND R =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND S =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND T =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND U =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND V =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND W =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND X =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Y =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND Z =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AA =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AB =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AC =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AD =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AE =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AF =\"No\" "), 
    ("SELECT COUNT(A) WHERE C =\"" + center + "\" AND todate(A) >=date \'" + from + "\' AND todate(A) <=date \'" + until + "\' AND AG =\"No\" ") 
    ]; 
for(var i=0; i<25; i++){ 
    getData(query[i]); 
// When all are done I will draw the table. 

} 
} 
</script> 
<script> 
function getData(incomingQuery) { 

    // Prepare the query 
    var queryString = encodeURIComponent(incomingQuery); 
    var query = new google.visualization.Query(
    //Collect the data from this spreadsheet 
    'MySpreadSheet URL' + queryString); 
    query.send(handleSampleDataQueryResponse); 

    //Handle any errors from the Google server 
    function handleSampleDataQueryResponse(response) { 
    if (response.isError()) { 
     alert('Error in query: ' + response.getMessage() + ' ' + 
     response.getDetailedMessage()); 
     return; 
    } 

    // get look into the resulting data and find the detail.  
    var datas = response.getDataTable(); 
    console.log(datas); 
    if (datas.Gf.length === 0) { 
     resultData = 0; 
    } else resultData = datas.Gf[0].c[0].v; 

    allData.push(resultData); 
     console.log(allData); 
    } 

} 
</script> 

回答

2

使用的承諾,你可以做到這一點

function runOnecode() { 
    var str = ""; 
    str += $(".google-visualization-controls-rangefilter-thumblabel").text(); 
    var until = str.substring(10); 
    var from = str.substring(0,10); 
    var center = $("#centerSelect option:selected").text(); 
    var query = [ 
     // your query data, removed for brevity ... 
    ]; 
    Promise.all(query.map(getData)) 
    .then(function(results) { 
     // results is an array of results in the same order as query 
    }) 
    .catch(function(err) { 
     // err is FIRST error - no other information about success/faill of other queries will be available 
    }); 
} 

function getData(incomingQuery) { 
    return new Promise(function(fulfill, reject) { 
     // Prepare the query 
     var queryString = encodeURIComponent(incomingQuery); 
     var query = new google.visualization.Query(
      //Collect the data from this spreadsheet 
      'MySpreadSheet URL' + queryString); 
     query.send(handleSampleDataQueryResponse); 

     //Handle any errors from the Google server 
     function handleSampleDataQueryResponse(response) { 
      if (response.isError()) { 
       throw('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage()); 
      } 

      // get look into the resulting data and find the detail.  
      var datas = response.getDataTable(); 
      console.log(datas); 
      if (datas.Gf.length === 0) { 
       resultData = 0; 
      } else { 
       resultData = datas.Gf[0].c[0].v; 
      } 
      fulfill(resultData); 
     } 
    }); 
} 

如果您需要獲取所有查詢成功/失敗的狀態,則可以使用Q其中有一個allSettled方法(而不是Promise.all),它返回所有的承諾的結果,無論成功/失敗的

或承諾,這裏有一個我自己滾

Promise.allSettled = function(arr) { 
    return Promise.all([].map.call(arr, 
     function(v) { 
      return Promise.resolve(v).then(
       function fulfilled (x) { return {fulfilled: true, value: x}; }, 
       function rejected (e) { return {fulfilled: false, value: e}; } 
      ); 
     }) 
    ); 
}; 
然後

runOnecode會是什麼樣子

function runOnecode() { 
    var str = ""; 
    str += $(".google-visualization-controls-rangefilter-thumblabel").text(); 
    var until = str.substring(10); 
    var from = str.substring(0,10); 
    var center = $("#centerSelect option:selected").text(); 
    var query = [ 
     // your query data, removed for brevity ... 
    ]; 
    Promise.allSettled(query.map(getData)) 
    .then(function(results) { 
     // results is an array of results in the same order as query 
     results.forEach(function(result) { 
      if (result.fulfilled) { 
       // successful 
       console.log(result.value); 
      } 
      else { 
       // unsuccessful 
       console.log(result.value); // will show the thrown error 
      } 
     }); 
    }); 
}