我正在尝试设置自定义数据工作室连接器。
在“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;
}
});
看起来让这个很好地工作的唯一方法就是一个接一个地进行两次提取。
它并不理想 - 但希望谷歌能够为Data Studio Connectors改进这一点
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
}