Async: cara membuat async berfungsi dengan async/menunggu

Dibuat pada 14 Feb 2019  ·  10Komentar  ·  Sumber: caolan/async

var async = require('async');

var workPool = async.queue(async (task, taskComplete)=>{
  console.log(1, taskComplete);

  async.retry(3, async (retryComplete)=>{

    console.log(2, retryComplete);
    // retryComplete(null, task);

  });
});

workPool.push("test");

Saya bertanya-tanya mengapa saya mendapatkan hasil ini:

$ node test.js
1 undefined
2 undefined
question

Komentar yang paling membantu

@pawelotto Saya pikir untuk itu Anda dapat menggunakan node promisify util, saya tidak menguji tetapi karena tanda tangan fungsi panggilan balik utama kompatibel, saya berasumsi itu akan berfungsi.

Jadi contoh di atas akan menjadi (tanpa penanganan error):

import async from "async"
import {promisify} from "util"

const promiseMapLimit = promisify(async.mapLimit)
const results = await promiseMapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
})

Semua 10 komentar

https://caolan.github.io/async/

Async menerima fungsi async di mana pun kami menerima fungsi panggilan balik gaya Node. Namun, kami tidak memberikan mereka panggilan balik, dan sebaliknya menggunakan nilai kembalian dan menangani setiap penolakan janji atau kesalahan yang dilemparkan.

async.mapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
}, (err, contents) => {
    if (err) throw err
    console.log(contents)
})

Ya, Async tidak meneruskan panggilan balik ke fungsi async -- kembali saja saat tugas selesai.

Dan bagaimana dengan mengembalikan nilai dari fungsi panggilan balik terakhir (alih-alih mencatatnya di konsol seperti dalam contoh ini)?

Hanya return ing nilai dari async fungsi bekerja dalam banyak kasus.

Fungsi async mana yang secara tepat mengembalikan nilai? Dari apa yang saya periksa, mereka kembali batal, misalnya
lakukan sampai

@pawelotto Saya pikir untuk itu Anda dapat menggunakan node promisify util, saya tidak menguji tetapi karena tanda tangan fungsi panggilan balik utama kompatibel, saya berasumsi itu akan berfungsi.

Jadi contoh di atas akan menjadi (tanpa penanganan error):

import async from "async"
import {promisify} from "util"

const promiseMapLimit = promisify(async.mapLimit)
const results = await promiseMapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
})

Mungkin Anda bisa mencoba neo-async

@kazaff keren, saya tidak tahu tentang itu, terima kasih!

@kazaff Legenda!

@kazaff cara menggunakan neo-async dalam jawaban b4dnewz, gagal mengembalikan hasil

Apakah halaman ini membantu?
0 / 5 - 0 peringkat