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

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粉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解决,但在非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.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan