Hai teman-teman, saya sedang mengerjakan Fungsi Async dan saya ingin mengembalikan nama yang saya dapatkan dari beberapa panggilan API lainnya. Kode saya seperti di bawah ini:

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

Masalahnya adalah, console.log di main.ts akan selalu berjalan terlebih dahulu (bahkan jika saya meletakkan console.log di dalam then promise callback) dan memberi saya nilai undefined sementara setelah beberapa waktu kode di apiAccessor.ts telah selesai, console.log di apiAccessor.ts memberi saya nilai yang benar yang saya inginkan. Namun ini tampaknya tidak dikembalikan ke main.ts seperti yang diharapkan.

Bagaimana saya bisa mengembalikan nilai atau membiarkan main.ts menunggu fungsi berjalan selesai terlebih dahulu?

Terima kasih untuk membaca dan menghargai jika ada yang bisa membantu!

0
Corene 29 Oktober 2019, 07:58

2 jawaban

Jawaban Terbaik

Masalah Anda adalah bahwa client.register tidak mengembalikan janji, dibutuhkan fungsi panggilan balik yang dijalankan secara internal tetapi tidak mengembalikan janji. Anda perlu membuat janji dan menyelesaikannya dalam fungsi panggilan balik Anda dan kemudian menunggu hasil dari janji tersebut.

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 Oktober 2019, 05:25

Dari kode Anda, sepertinya client.register((error, result) => { menggunakan panggilan balik dan tidak mengembalikan Janji. Oleh karena itu await Anda di depannya tidak melakukan apa yang Anda pikirkan. Anda dapat membungkus panggilan Anda ke client.resolve dengan Promise dan hanya menyelesaikan/menolaknya setelah panggilan balik memberi Anda hasilnya.

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 Oktober 2019, 05:32