簡體   English   中英

變量返回未定義甚至在 typescript 中異步分配 function

[英]Variable return undefined even assigned in async function in typescript

大家好,我正在研究 Async Function,我希望它返回一個我從其他 API 調用中獲得的名稱。 我的代碼如下:

apiAccessor.ts

async registerName(): Promise<any>{
        try{
            await client.register((error, result) => {
                if(error){
                    console.error(`Error register name: ${error}`);
                }
                else{
                    console.log('Registered Successfully!');
                    this.assignedPlace = result.assignedPlace;
                    console.log(this.assignedPlace);
                }
            });
            return this.assignedPlace;
        }
        catch (error) {
            this.logger.error(error.name, error.message);
        }

main.ts

async function nameAssigner() {
    let place = await client.registerName();
    console.log(place);
}

nameAssigner();

問題是, main.ts中的 console.log 將始終首先運行(即使我將 console.log 放入then promise 回調)並給我undefined的值,而一段時間后apiAccessor.ts中的代碼已經完成,控制台.log in apiAccessor.ts給了我想要的正確值。 然而,這似乎並沒有像預期的那樣返回到main.ts

如何返回值或讓main.ts等待 function 先運行完成?

感謝您的閱讀,如果有人可以提供幫助,我們將不勝感激!

您的問題是 client.register 不返回 promise,它需要一個在內部運行但不返回 promise 的回調 function。 您需要創建一個 promise 並在您的回調 function 中解決它,然后等待 promise 的結果。

async registerName(): Promise<any>{
    try{

         let promise = new Promise(function(resolve, reject) {
            client.register((error, result) => {
              if(error){
                reject(`Error register name: ${error}`);
              }
              else{
                console.log('Registered Successfully!');
                resolve(result.assignedPlace);
                console.log(this.assignedPlace);
              }
          });
        });
        this.assignedPlace = await promise;
        return this.assignedPlace;
    }
    catch (error) {
        this.logger.error(error.name, error.message);
    }

從您的代碼來看,它看起來像client.register((error, result) => {使用回調並且沒有返回 Promise。因此,您在它前面的await並沒有按照您的想法進行。您可以將調用包裝到client.resolve使用Promise並僅在回調為您提供結果后解決/拒絕它。

return new Promise((resolve,reject) => {
  try {
    client.register((error, result) => {
      if(error){
        console.error(`Error register name: ${error}`);
        return reject(error);
      }
      else{
        console.log('Registered Successfully!');
        return resolve(result.assignedPlace); 
      }
    });
  }
  catch (error) {
    this.logger.error(error.name, error.message);
    return reject(error);
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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