简体   繁体   English

变量返回未定义甚至在 typescript 中异步分配 function

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

Hi guys I was working on a Async Function and I want it to return a name that I get from some other API calls.大家好,我正在研究 Async Function,我希望它返回一个我从其他 API 调用中获得的名称。 My code are as below:我的代码如下:

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();

The problem is, the console.log in main.ts will always run first (even if I put the console.log inside then promise callback) and giving me undefined value while after some time the code in apiAccessor.ts had finished, the console.log in apiAccessor.ts gave me the correct value I want.问题是, main.ts中的 console.log 将始终首先运行(即使我将 console.log 放入then promise 回调)并给我undefined的值,而一段时间后apiAccessor.ts中的代码已经完成,控制台.log in apiAccessor.ts给了我想要的正确值。 However this does not seems to be returned to the main.ts as expected.然而,这似乎并没有像预期的那样返回到main.ts

How can I return the value or let the main.ts wait for the function to run complete first?如何返回值或让main.ts等待 function 先运行完成?

Thanks for the reads and appreciates if anyone could help!感谢您的阅读,如果有人可以提供帮助,我们将不胜感激!

Your problem is that client.register does not return a promise, it takes a call back function that is run internally but does not return a promise.您的问题是 client.register 不返回 promise,它需要一个在内部运行但不返回 promise 的回调 function。 You need to create a promise and resolve it in your callback function and then await the result from the promise.您需要创建一个 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);
    }

From your code it looks like client.register((error, result) => { uses a callback and is not returning a Promise. Therefore your await in front of it doesn't do what you think. You can wrap your call to client.resolve with a Promise and only resolve/reject it once the callback gives you the result.从您的代码来看,它看起来像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