Async: как заставить работать async с async / await

Созданный на 14 февр. 2019  ·  10Комментарии  ·  Источник: 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");

Интересно, почему я получил такой результат:

$ node test.js
1 undefined
2 undefined
question

Самый полезный комментарий

@pawelotto Я думаю, что для этого вы можете использовать node promisify util, я не тестировал, но поскольку основная сигнатура функции обратного вызова совместима, я предполагаю, что она будет работать.

Таким образом, приведенный выше пример станет (без ошибки обработки):

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

Все 10 Комментарий

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

Async принимает асинхронные функции везде, где мы принимаем функцию обратного вызова в стиле узла. Однако мы не передаем им обратный вызов, а вместо этого используем возвращаемое значение и обрабатываем любые отклонения обещаний или выданные ошибки.

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

Да, Async не передает обратные вызовы функциям async - просто возвращает, когда задача завершена.

А как насчет возврата значений из последней функции обратного вызова (вместо их консольного журнала, как в этом примере)?

В большинстве случаев работают только return ing значения из async функций.

Какая функция async точно возвращает значение? Из того, что я проверил, они возвращают void, например
doUntil

@pawelotto Я думаю, что для этого вы можете использовать node promisify util, я не тестировал, но поскольку основная сигнатура функции обратного вызова совместима, я предполагаю, что она будет работать.

Таким образом, приведенный выше пример станет (без ошибки обработки):

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

Может быть, ты можешь попробовать нео-асинхронный режим

@kazaff круто, я не знал об этом, спасибо!

@kazaff Legend!

@kazaff, как использовать neo-async в ответе b4dnewz, просто не верните reulst

Была ли эта страница полезной?
0 / 5 - 0 рейтинги