Привет, ребята, я работал над Асинхронной Функцией и хочу, чтобы она возвращала имя, полученное от некоторых других вызовов 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();

Проблема в том, что console.log в main.ts всегда будет запускаться первым (даже если я поместил console.log в обратный вызов обещания then) и даст мне значение undefined, а через некоторое время код в apiAccessor.ts завершен, console.log в apiAccessor.ts дал мне правильное значение, которое я хочу. Однако, похоже, это не возвращается main.ts, как ожидалось.

Как я могу вернуть значение или дать main.ts дождаться завершения функции в первую очередь?

Спасибо за чтение и ценит, если кто-нибудь может помочь!

0
Corene 29 Окт 2019 в 07:58

2 ответа

Лучший ответ

Ваша проблема в том, что client.register не возвращает обещание, он принимает функцию обратного вызова, которая запускается изнутри, но не возвращает обещание. Вам нужно создать обещание и разрешить его в функции обратного вызова, а затем ожидать результата от обещания.

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);
    }
1
Adrian Brand 29 Окт 2019 в 05:25

Из вашего кода похоже, что client.register((error, result) => { использует обратный вызов и не возвращает обещание. Поэтому ваш 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);
  }
});
1
Always Learning 29 Окт 2019 в 05:32