[英]Promise resolves earlier than expected and not returning an AXIOS call value
我正在向一個快速連續生成多個字符串的服務發出請求。 我的問題是因為必須使用此服務返回 promise,因為我不控制返回字符串的服務進程。
我想強調一個事實,我必須返回一個 promise。
現在,我擁有的是主要的 function (handler.ts),它不維護任何業務邏輯,僅包括以下內容:
public static callback: any;
public static async init(configuration, callback): Promise<any> {
this.callback = callback;
...
return new Promise((resolve, reject) => {
try {
const result = await Service.bootstrap(configuration)
return resolve(result)
} catch(err) {
reject(err)
}
}
}
此處理程序調用服務,該服務具有引導程序 function,該服務執行對 a.js 文件的調用,該文件從我的計算機獲取一些信息,然后返回有關它的字符串。
import loadComputerInformation from 'load.js'
public async bootstrap() : Promise<any> {
loadComputerInformation();
function useComputerInfoString() {
// window.getInfo is generated by loadComputerInformation(), and I can not control
// when does it return it, as it generates several strings with rapid succession
// and until the function exists, I will not get my string.
if (typeof window.getInfo !== 'function') {return;}
const data = window.getInfo();
if (data.finished) {
clearTimeout(timeoutId);
const infoString = data.computerInfo;
Service.axiosCall(infoString);
}
}
// I have to set an interval to perform the call several times, and until it resolves it
// it will not stop performing this call.
const timeoutId = setInterval(useComputerInfoString, 500);
}
return;
}
因此,我面臨的問題是我的 promise 在另一個線程中丟失了,我無法從Service.axiosCall(infoString)返回值,這只是一個標准的 axios 調用,但這必然需要infoString 。
添加 axios 調用 function 以防它有用。 現在,我正在使用傳遞給 handler.js 的回調返回 axios 調用,但我希望能夠將其包含在 Promise 中,而無需回調 function
public static async axiosCall(blackbox): Promise<any> {
await axios.post('https://somecall.com/info', blackbox)
.then((response) => { this.callback(element)
return element);
}
}
知道如何解決這個問題嗎?
強調
請注意,loadComputerInformation() 異步加載 Window.getInfo(),但它不只解析一個值,而是解析多個值,因此我不能在 Window.getInfo() 上等待,因為在開始時它不存在,只會返回不明確的
此外,現在代碼已啟動並運行,但它返回值的方式是通過回調而不是 promise。
嘗試bootstrap
function,其返回的 promise 解析為 axios 調用返回的響應。
此建議(基於帖子中的信息)是 vanilla JavaScript,用於演示如何解決該問題。 顯然需要修改以將其集成到應用程序中:
const bootstrap = () => new Promise( resolve => {
loadComputerInformation();
let state = "load";
const timer = setInterval( ()=> {
if( state == "load") {
if( typeof window.getData != "function") {
return;
}
state = "get";
}
let data;
if( state == "get") {
data = window.getData();
if(!data.finished) {
return;
}
// state = "request";
}
clearInterval(timer);
resolve( axios('post', "https:example.com/info", data.computerInfo) );
}, 100); // 1/10th second?
};
請注意,此答案已修改為使用 state 機器等待異步加載getData
,然后等待調用getData
以返回具有finished
屬性的數據 object,然后再解析返回的 promise 和 axios 返回的axios
調用 - 第一個答案很簡單,直到它需要等待異步加載getData
代碼。
問題的背后是一個可能不得不注銷代碼債務的問題:JavaScript 是事件驅動的。 loadComputerInformation
似乎是為要輪詢的結果而編寫的。 很難想象它留在那個 state 中的正當理由。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.