以下 TypeScript 函式將從 Web API 檢索資料并將其從函式內顯示到控制臺,但是當我嘗試回傳資料物件(字串)時,我收到錯誤訊息。我試圖通過回傳 JSON 資料物件,return data;但編譯器認為我沒有回傳任何內容。請問,我做錯了什么?
async function main(url: string, query: string): Promise<string> {
const axios = require('axios');
axios.get(url, {params: {"query": query}})
.then(function (response: any) {
let data = JSON.stringify(response.data);
console.log("data: " data);
return data;
})
.catch(function (error: any) {
console.log(error);
return "error";
});
}
var url: string = 'https://api.subquery.network/sq/AcalaNetwork/karura-tokens';
var query = "{accountBalances (first: 5) {nodes{id accountId tokenId total}}}"
var res = main(url, query).catch(e => console.error(e)).finally(() => process.exit(0))
console.log("res:" res);
這是輸出:
src/index.ts:1:50 - error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value.
1 async function main(url: string, query: string): Promise<string> {
在我的示例中,我試圖回傳一個字串,但我很高興回傳一個字串或 JSON 物件。我就是不能讓任何一個作業。
uj5u.com熱心網友回復:
一種可能的解決方案(有點老套)是從你的函式中回傳承諾,res在全域范圍內宣告你的變數,并在承諾回呼中,分配承諾決議為的值res。
但實際分配只會在 promise 解決后發生,因此您可以設定超時以在 promise 回呼之外使用變數。
例如:
function get_sq(url: string, query: string): Promise<any>{
const axios = require('axios');
return axios.get(url, {params: {"query": query}});
}
var url: string = 'https://api.subquery.network/sq/AcalaNetwork/karura-tokens';
var query = "{accountBalances (first: 5) {nodes{id accountId tokenId total}}}"
var res;
get_sq(url, query).then(function (response: any) {
res = JSON.stringify(response.data);
}).catch(function (error: any) {
res = error;
});
setTimeout(() => {console.log("res:" res);}, 3000);
另一種可能性(更強大的一種)是保留在 Promise 回呼中并在那里做你想做的事情res。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463820.html
