Kode saya:

class MyPromise extends Promise {
  constructor(func) {
    super(func);
  }
  SomePromiseExtensionMethod() {
    // do stuff...
  }
}

let test = async function() {
  let promise = new MyPromise(function (resolve) {
    console.log('foo');

    resolve();
  });
  
  console.log('start printing:');
  
  await promise;
};

test();

Saya condong Promise dan ingin membuat kelas yang diturunkan dari kelas Promise.

Pertanyaan saya: Apakah ada cara untuk menunda pencetakan foo hingga saya memanggil await promise?

PERBARUI:

Saya ingin membuat kelas ini karena saya ingin menjalankan metode lain saat objeknya adalah Promise. (Sama seperti: mypromise.SomePromiseExtensionMethod()).

PEMBARUAN 2: Proyek saya yang sebenarnya:

    let Task = (function () {
        let __data = {};

        __data.Run = function (...args) {
            if (args.length) {
                let func = args[0];

                return new Task(func);
            }
        };
        
        class Task extends Promise {
            constructor(action) {
                super(action);
            }
            static set Run(value) {
                return __data.Run;
            }
            static get Run() {
                return (...args) => __data.Run.call(this, ...args);
            }
        }
        return Task;
    }());
    
    let test = async () => {
      let task = Task.Run(r => r(console.log('foo')));
      
      console.log('start printing');
      
      await task;
    };
    
    test();
0
user7739271 14 Agustus 2017, 18:28

2 jawaban

Jawaban Terbaik

Apakah ada cara untuk menunda pencetakan foo hingga saya memanggil await promise?

Ya, ini dikenal sebagai janji "malas". Perhatikan bahwa await hanyalah gula untuk memanggil metode then, jadi kita dapat melakukannya dengan menimpa metode then dan baru kemudian menjalankan callback eksekutor:

class MyPromise extends Promise {
  constructor(func) {
    let run;
    super((resolve, reject) => {
      run = () => func(resolve, reject);
    });
    this.run = run;
  }
  then(onfulfilled, onrejected) {
    const run = this.run;
    if (run) {
      this.run = null;
      run();
    }
    return super.then(onfulfilled, onrejected);
  }
}

(async function test() {
  let promise = new MyPromise(function (resolve) {
    console.log('foo');
    resolve();
  });

  console.log('start printing:');

  await promise;
}());

Silakan gunakan ini hanya untuk latihan pembelajaran, saya tidak akan merekomendasikan untuk menggunakan pola ini dalam proyek yang sebenarnya.

1
Bergi 14 Agustus 2017, 15:39

Anda dapat melakukannya dengan then:

class MyPromise extends Promise {
  constructor(func) {
    super(func);
  }
}

let test = async () => {
  let promise = new MyPromise(function (resolve) {
    resolve();
  }).then(_ => console.log('foo'));
  
  console.log('start printing:');
  
  await promise;
};

test();

NB: Merupakan ide yang buruk untuk memperpanjang objek Promise.

-1
trincot 14 Agustus 2017, 15:30