簡體   English   中英

Promise 比預期更早解析並且未返回 AXIOS 調用值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM