Коннектор Data Studio: Выполняете обещание? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь настроить пользовательский разъем студии передачи данных.

В вызове getData мне нужно выполнить два вызова API, прежде чем я верну данные.Мне сказали, что использование обещания javascript - лучший способ добиться этого.

Как получить метод 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 голосов
/ 23 марта 2019

Похоже, что единственный способ заставить это работать хорошо - это делать обе выборки одну за другой.

Это не идеально, но, надеюсь, Google улучшит это для Data Studio Connectors

0 голосов
/ 23 марта 2019

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
}
...