我使用以下有效的代码!我能够从扩展中获取数据,然后http200
Promise.all([
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'run:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
}),
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'exe:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
})
]).then(axios.spread((...responses: AxiosResponse[]) => {
const aToken = responses[0];
const bToken = responses[1];
}).catch(function(error: any) {
console.log("Error: " + error);
});
现在,我想用异步函数包装它,该函数返回两个响应(responses [0],responss [1])
我已经创建了此功能
const FetchData = async (): Promise<{ run: string; app: string }> => {
let aToken:string;
let bToken:string;
Promise.all([
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'run:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
}),
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'exe:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
})
]).then(axios.spread((...responses: AxiosResponse[]) => {
aToken = responses[0];
bToken = responses[1];
}).catch(function(error: any) {
console.log("Error: " + error);
});
// add this return
return {
run: aToken ,
app: bToken
};
)}
现在,我已经创建了调用它并获取令牌的函数
async function main() {
let val = await FetchData();
console.log(val)
}
问题是我在val
属性中得到了空值,同时在主函数中放置了一个断点
我看到我进入控制台之前,实际上是从).then(axios.spread((
获取值的,
知道如何采用代码从价差运算符返回值然后调用控制台吗?
答案 0 :(得分:1)
sum_over_time(my_metrics{my_filter=~"filter_regex"}[4d])
答案 1 :(得分:1)
您没有正确使用async-await
。您需要等待Promise.all
。一旦两个承诺都得到解决,响应数据将位于您从data
获得的每个响应对象中的名为axios
的属性中。如果您需要整个响应对象,则可以对其进行分解
这是一个例子
const FetchData = async (): Promise<{ run: string; app: string }> => {
try {
const [response1, response2] = await Promise.all([
axios({
...
}),
axios({
...
})
]);
return {
run: response1,
app: response2
};
} catch (error) {
console.log(error);
}
};
这是一个demo,可以从jsonplaceholder api的两个端点中获取数据
答案 2 :(得分:1)
您需要更改return语句的位置:
具有更改的更新代码:
const FetchData = (): Promise<{ run: string; app: string }> => {
let aToken:string;
let bToken:string;
// Return the promise here
return Promise.all([
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'run:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
}),
axios({
method: 'post',
url: 'https://oauth2.-arch.mand.com/oauth2/token',
data: qs.stringify({
'grant_type': 'client_credentials'
}, {
'scope': 'exe:crud'
}),
headers: {
'Accept': 'application/json',
'Authorization': 'Basic NTgwNjgtMDhhZTczOGNl',
'Content-Type': 'application/x-www-form-urlencoded',
}
})
]).then(axios.spread((...responses: AxiosResponse[]) => {
aToken = responses[0];
bToken = responses[1];
// This return is for getting the data once the promise is resolved either with then or await
return {
run: aToken ,
app: bToken
};
}).catch(function(error: any) {
console.log("Error: " + error);
return error;
});
)}
由于您要在兑现承诺之前返回值,因此您不会获得任何数据。 您需要返回promise,然后在内部需要返回所需的数据,以在调用函数中解决promise后获得。