Saya menulis kode ini di lib/helper.js
var myfunction = async function(x,y) {
....
reutrn [variableA, variableB]
}
exports.myfunction = myfunction;
dan kemudian saya mencoba menggunakannya di file lain
var helper = require('./helper.js');
var start = function(a,b){
....
const result = await helper.myfunction('test','test');
}
exports.start = start;
Saya mendapat kesalahan
"await hanya valid dalam fungsi async"
Apa masalahnya?
javascript
node.js
j.doe
sumber
sumber
await
hanya bisa digunakan di dalam suatuasync
fungsi. Artinya,await
membuat fungsi menjadi asinkron, jadi harus dideklarasikan seperti itu.Jawaban:
Kesalahannya tidak mengacu pada,
myfunction
tetapi padastart
.Saya menggunakan kesempatan dari pertanyaan ini untuk memberitahu Anda tentang anti pola dikenal menggunakan
await
yaitu:return await
.SALAH
BENAR
Juga, ketahuilah bahwa ada kasus khusus di mana
return await
benar dan penting: (menggunakan coba / tangkap)Apakah ada masalah kinerja dengan `kembali menunggu`?
sumber
start
sebagaiasync
fungsi (meskipun beberapa akan memilih untuk melakukannya, agar lebih eksplisit)Ketika saya mendapatkan kesalahan ini, ternyata saya memiliki panggilan ke fungsi peta di dalam fungsi "async" saya, jadi pesan kesalahan ini sebenarnya merujuk ke fungsi peta yang tidak ditandai sebagai "asinkron". Saya mengatasi masalah ini dengan mengambil panggilan "menunggu" dari fungsi peta dan menemukan cara lain untuk mendapatkan perilaku yang diharapkan.
sumber
someArray.map(async (someVariable) => { return await someFunction(someVariable)})
await
kode Anda menyesatkan, karenaArray.map
tidak akan menangani fungsi sebagai fungsi asinkron. Untuk lebih jelasnya, setelahmap
fungsi selesai,someFunction
semua akan tertunda. Jika Anda ingin benar-benar menunggu fungsinya selesai Anda harus menulis:await Promise.all(someArray.map(someVariable => someFunction(someVariable)))
atauawait Promise.all(someArray.map(someFunction)))
.Untuk menggunakannya
await
, konteks pelaksanaannya harus bersifatasync
alamiSeperti yang dikatakan, Anda perlu menentukan sifat di
executing context
mana Anda bersediaawait
melakukan tugas sebelum apa pun.Letakkan saja
async
sebelumfn
deklarasi di manaasync
tugas Anda akan dieksekusi.Penjelasan:
Dalam pertanyaan Anda, Anda mengimpor a
method
yang adaasynchronous
di alam dan akan dieksekusi secara paralel. Tetapi di mana Anda mencoba untuk mengeksekusiasync
metode itu di dalam yang berbedaexecution context
yang perlu Anda tentukanasync
untuk digunakanawait
.Ingin tahu apa yang terjadi di balik terpal
await
menggunakan metode / fungsi yang menjanjikan / masa depan / pengembalian tugas danasync
menandai metode / fungsi yang mampu menggunakan await.Juga jika Anda terbiasa
promises
,await
sebenarnya melakukan proses janji / ketetapan hati yang sama. Membuat rantai janji dan menjalankan tugas Anda berikutnya diresolve
callback untuk Anda.Untuk info lebih lanjut, Anda dapat merujuk ke MDN DOCS .
sumber
Implementasi saat ini dari
async
/await
hanya mendukungawait
kata kunci di dalamasync
fungsi Ubahstart
tanda tangan fungsi Anda sehingga Anda dapat menggunakanawait
di dalamnyastart
.Bagi yang berminat, proposal untuk level teratas
await
saat ini berada di Tahap 2: https://github.com/tc39/proposal-top-level-awaitsumber
async
- itulah seluruh titik dariasync
.--experimental-repl-await
opsi.Saya memiliki masalah yang sama dan blok kode berikut memberikan pesan kesalahan yang sama:
Masalahnya adalah bahwa metode getCommits () adalah async tetapi saya meneruskannya ke repo argumen yang juga dihasilkan oleh Promise. Jadi, saya harus menambahkan kata async ke dalamnya seperti ini: async (repo) dan itu mulai berfungsi:
sumber
async / await adalah mekanisme penanganan promise, dua cara kita dapat melakukannya
atau kita dapat menggunakan menunggu untuk menunggu janji untuk mengajukannya secara penuh terlebih dahulu, yang berarti ditolak atau diselesaikan.
Sekarang jika kita ingin menggunakan await (menunggu janji untuk dipenuhi) di dalam suatu fungsi, fungsi container harus berupa fungsi async karena kita menunggu janji untuk dipenuhi secara asinkron || masuk akal kan ?.
sumber
"await hanya valid dalam fungsi async"
Tapi kenapa? 'await' secara eksplisit mengubah panggilan async menjadi panggilan sinkron, dan oleh karena itu pemanggil tidak dapat asinkron (atau asinkron) - setidaknya, bukan karena panggilan dilakukan di 'await'.
sumber
Ya, await / async adalah konsep yang bagus, tetapi implementasinya benar-benar rusak.
Untuk alasan apa pun, kata kunci await telah diterapkan sedemikian rupa sehingga hanya dapat digunakan dalam metode async. Ini sebenarnya bug, meskipun Anda tidak akan melihatnya disebut seperti itu di mana pun kecuali di sini. Perbaikan untuk bug ini adalah dengan mengimplementasikan kata kunci await sedemikian rupa sehingga hanya dapat digunakan UNTUK MEMANGGIL fungsi asinkron, terlepas dari apakah fungsi pemanggil itu sendiri sinkron atau asinkron.
Karena bug ini, jika Anda menggunakan await untuk memanggil fungsi asynchronous nyata di suatu tempat dalam kode Anda, maka SEMUA fungsi Anda harus ditandai sebagai async dan SEMUA panggilan fungsi Anda harus menggunakan await.
Ini pada dasarnya berarti bahwa Anda harus menambahkan overhead promise ke semua fungsi di seluruh aplikasi Anda, yang sebagian besar tidak dan tidak akan pernah asinkron.
Jika Anda benar-benar memikirkannya, menggunakan await dalam suatu fungsi harus memerlukan fungsi yang berisi kata kunci await TO NOT BE ASYNC - ini karena kata kunci await akan menghentikan pemrosesan dalam fungsi di mana kata kunci await ditemukan. Jika pemrosesan dalam fungsi itu dihentikan sementara, maka sudah pasti BUKAN asinkron.
Jadi, bagi para pengembang javascript dan ECMAScript - perbaiki implementasi await / async sebagai berikut ...
sumber
async
sehingga mencerminkan fakta bahwa banyak fungsi Anda memerlukan hasil dari proses eksternal. Itu sepenuhnya kanonik menurut saya.await
hanya dapat digunakan dengan pemanggilan fungsi: untuk satu proses eksternal, hanya satu titik dalam kode javascript yang dapat diberitahukan ketika proses tersebut selesai. Misalnya, jika konten file diperlukan untuk 3 tujuan independen, masing-masing tujuan perlu dilakukan secara independenlet content = await readTheFile();
- ini karena "janji konten file" tidak dapat ditunggu, hanya "tindakan membaca file dan melanjutkan setelah file tersebut selesai. Baca".