Fungsi tak segerak mengembalikan Janji, bukan nilai
P粉464208937
P粉464208937 2023-10-19 18:54:01
0
2
397

Saya cuba memahami cara async/menunggu berfungsi dengan Promise.

async function latestTime() { const bl = await web3.eth.getBlock('latest'); console.log(bl.timestamp); // Returns a primitive console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise return bl.timestamp; } const time = latestTime(); // Promise {  }

Dari apa yang saya faham, await sepatutnya menyekat, dan dalam kod di atas nampaknya menghalangtimestamp返回对象blprimitif daripada digunakan. Fungsi saya kemudian mengembalikan nilai asal, tetapi pembolehubah masa ditetapkan kepada janji yang belum selesai dan bukannya nilai asal itu. Apa yang saya terlepas?

P粉464208937
P粉464208937

membalas semua (2)
P粉099985373

Awalan tak segerak ialah pembalut untuk Janji.

async function latestTime() { const bl = await web3.eth.getBlock('latest'); console.log(bl.timestamp); // Returns a primitive console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise return bl.timestamp; }

Sama seperti

function latestTime() { return new Promise(function(resolve,success){ const bl = web3.eth.getBlock('latest'); bl.then(function(result){ console.log(result.timestamp); // Returns a primitive console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise resolve(result.timestamp) }) }
    P粉002023326

    async函数始终返回一个 Promise。这就是它报告异步工作完成情况的方式。如果您在另一个async函数中使用它,则可以使用await来等待其promise解决,但在非asyncfungsi (biasanya di peringkat atas atau dalam pengendali acara), anda mesti menggunakan Promise secara langsung, contohnya:

    latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });

    ...Namun, jika anda melakukan ini pada tahap teratas modul JavaScript, semua persekitaran moden kini menyokongTahap atas dalam modulawait:

    const time = await latestTime();

    (Perhatikan bahawa jika Janji ini ditolak, modul anda akan gagal dimuatkan. Jika modul anda berfungsi dengan bermakna walaupun Janji gagal, pastikan anda membungkusnyatry/catch 中untuk menangani penolakan janji.)


    Iamungkin(atau mungkin tidak) mendedahkan sesuatu dalam bentuk istilah panggil balik janji yang jelas, memberi kami gambaran tentang cara enjin JavaScript mengendalikan fungsiasyncanda di bawah hud:

    function latestTime() { return new Promise((resolve, reject) => { web3.eth.getBlock('latest') .then(bl => { console.log(bl.timestamp); console.log(typeof bl.timestamp.then == 'function'); resolve(bl.timestamp); }) .catch(reject); }); }

    Beberapa nota penting:

    • Anda menghantarnya kenew Promise的函数(promise 执行器函数)由new Promisepanggilan segerak.
      • Inilah sebabnya operasi bermula, panggilan segerakweb3.eth.getBlockuntuk mula bekerja.
    • Sebarang kesilapan (dsb.) yang dilemparkan ke dalam pelaksana Janji akannew Promiseditangkap dan ditukar menjadi penolakan Janji.
    • Sebarang ralat yang dilemparkan dalam panggilan balik Promise (sepertithenralat yang kami lalui) akan ditangkap dan ditukar menjadi penolakan.
      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!