cari

Rumah  >  Soal Jawab  >  teks badan

Fungsi tak segerak mengembalikan Janji, bukan nilai

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 { <pending> }

Dari apa yang saya faham, await sepatutnya menyekat, dan dalam kod di atas nampaknya menghalang timestamp 返回对象 bl primitif 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粉464208937P粉464208937496 hari yang lalu583

membalas semua(2)saya akan balas

  • P粉099985373

    P粉0999853732023-10-20 14:57:49

    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)
            })
    }

    balas
    0
  • P粉002023326

    P粉0020233262023-10-20 12:58:06

    async 函数始终返回一个 Promise。这就是它报告异步工作完成情况的方式。如果您在另一个async函数中使用它,则可以使用await来等待其promise解决,但在非async fungsi (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 menyokong Tahap atas dalam modul await:

    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 membungkusnya try/catch 中 untuk menangani penolakan janji.)


    Ia mungkin (atau mungkin tidak) mendedahkan sesuatu dalam bentuk istilah panggil balik janji yang jelas, memberi kami gambaran tentang cara enjin JavaScript mengendalikan fungsi async anda 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 ke new Promise 的函数(promise 执行器函数)由 new Promise panggilan segerak.
      • Inilah sebabnya operasi bermula, panggilan segerak web3.eth.getBlock untuk mula bekerja.
    • Sebarang kesilapan (dsb.) yang dilemparkan ke dalam pelaksana Janji akan new Promise ditangkap dan ditukar menjadi penolakan Janji.
    • Sebarang ralat yang dilemparkan dalam panggilan balik Promise (seperti then ralat yang kami lalui) akan ditangkap dan ditukar menjadi penolakan.

    balas
    0
  • Batalbalas