Ini tidak akan pernah berhasil.
Kata async
kunci memungkinkan await
untuk digunakan dalam fungsi yang ditandai sebagai async
tetapi juga mengubah fungsi itu menjadi generator janji. Jadi fungsi yang ditandai dengan async
akan mengembalikan janji. Konstruktor di sisi lain mengembalikan objek yang dibangunnya. Dengan demikian kami memiliki situasi di mana Anda ingin mengembalikan objek dan janji: situasi yang mustahil.
Anda hanya dapat menggunakan async / menunggu di mana Anda dapat menggunakan janji karena itu pada dasarnya adalah sintaksis gula untuk janji. Anda tidak dapat menggunakan janji dalam konstruktor karena konstruktor harus mengembalikan objek yang akan dibangun, bukan janji.
Ada dua pola desain untuk mengatasi ini, keduanya diciptakan sebelum janji ada.
Penggunaan suatu init()
fungsi. Ini bekerja sedikit seperti jQuery .ready()
. Objek yang Anda buat hanya dapat digunakan di dalamnya init
atauready
berfungsi:
Pemakaian:
var myObj = new myClass();
myObj.init(function() {
// inside here you can use myObj
});
Penerapan:
class myClass {
constructor () {
}
init (callback) {
// do something async and call the callback:
callback.bind(this)();
}
}
Gunakan pembangun. Saya belum pernah melihat ini banyak digunakan dalam javascript tapi ini adalah salah satu yang paling umum di Jawa ketika sebuah objek perlu dibangun secara tidak sinkron. Tentu saja, pola pembangun digunakan ketika membangun objek yang membutuhkan banyak parameter rumit. Yang persis seperti kasus penggunaan untuk pembangun asinkron. Perbedaannya adalah bahwa pembangun async tidak mengembalikan objek tetapi janji objek itu:
Pemakaian:
myClass.build().then(function(myObj) {
// myObj is returned by the promise,
// not by the constructor
// or builder
});
// with async/await:
async function foo () {
var myObj = await myClass.build();
}
Penerapan:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static build () {
return doSomeAsyncStuff()
.then(function(async_result){
return new myClass(async_result);
});
}
}
Implementasi dengan async / menunggu:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static async build () {
var async_result = await doSomeAsyncStuff();
return new myClass(async_result);
}
}
Catatan: meskipun dalam contoh di atas kami menggunakan janji untuk pembangun async, mereka tidak secara tegas diperlukan. Anda dapat dengan mudah menulis pembangun yang menerima panggilan balik.
Catatan tentang fungsi panggilan di dalam fungsi statis.
Ini tidak ada hubungannya dengan konstruktor async tetapi dengan apa arti kata kunci this
sebenarnya (yang mungkin sedikit mengejutkan bagi orang-orang yang berasal dari bahasa yang melakukan resolusi otomatis dari nama metode, yaitu, bahasa yang tidak memerlukan this
kata kunci).
Kata this
kunci mengacu pada objek yang dipakai. Bukan kelas. Karena itu Anda biasanya tidak dapat menggunakanthis
fungsi statis di dalam karena fungsi statis tidak terikat pada objek apa pun tetapi terikat langsung ke kelas.
Artinya, dalam kode berikut:
class A {
static foo () {}
}
Anda tidak dapat melakukan:
var a = new A();
a.foo() // NOPE!!
alih-alih, Anda perlu menyebutnya sebagai:
A.foo();
Karenanya, kode berikut akan menghasilkan kesalahan:
class A {
static foo () {
this.bar(); // you are calling this as static
// so bar is undefinned
}
bar () {}
}
Untuk memperbaikinya, Anda dapat membuat bar
fungsi biasa atau metode statis:
function bar1 () {}
class A {
static foo () {
bar1(); // this is OK
A.bar2(); // this is OK
}
static bar2 () {}
}