Data Studio连接器:是否兑现承诺?

时间:2019-03-23 01:45:12

标签: javascript google-data-studio

我正在尝试设置自定义Data Studio连接器。

在“ getData”调用中,我需要先运行两个api调用,然后再返回数据。有人告诉我,使用JavaScript Promise是实现此目标的最佳方法。

我如何使'GetData'方法仅在诺言完成后才返回?这可能吗?

Here is the example of the promise

    function getData(request) {
      var apiRequest1 = fetch('www.domain.com/api1').then(function(response){ 
             return response.json()
    });
    var apiRequest2 = fetch('www.domain.com/api2').then(function(response){
             return response.json()
    });

    var combinedData = {"apiRequest1":{},"apiRequest2":{}};
    Promise.all([apiRequest1,apiRequest2]).then(function(values){
        combinedData["apiRequest1"] = values[0];
        combinedData["apiRequest2"] = values[1];
        console.log("combined2"+JSON.stringify(combinedData))
        return combinedData;

    }

 requestedSchema.forEach(function(field) {
    switch (field.name) {
      case 'weburl':
        var urltoTest = request.configParams.urlTotest;
        values.push(urltoTest);
        break;
      case 'pageSpeed':
        var pageSpeed = parsedResponse.ruleGroups.SPEED.score;
        values.push(pageSpeed);
        break;
      default:
        values.push('');
        break;
    }
  });

2 个答案:

答案 0 :(得分:0)

看起来要使此文件正常工作,唯一的方法是将两个文件相互取回。

这并不理想-但希望Google可以针对Data Studio连接器进行改进

答案 1 :(得分:-2)

response.json()实际上返回了另一个Promise,因此您需要遵循以下内容

Promise.all([apiRequest1, apiRequest2]).then((rawResponses) => {

    Promise.all(rawResponses.map(response => response.json())).then((values) => {
        combinedData["apiRequest1"] = values[0];
        ...
    });
});

如果您的环境支持,则可以使用async/await语法使其更整洁:

async function getData(request) {
    const apiResponse1 = await fetch('www.domain.com/api1');
    const apiResponse2 = await fetch('www.domain.com/api2');

    const combinedData = {"apiRequest1":{},"apiRequest2":{}};
    const rawResponses = [apiResponse1, apiResponse2].map(response => response.json());

    const values = await Promise.all(rawResponses);
    // do stuff with values array
}