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
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
Самый полезный комментарий
@pawelotto Я думаю, что для этого вы можете использовать node promisify util, я не тестировал, но поскольку основная сигнатура функции обратного вызова совместима, я предполагаю, что она будет работать.
Таким образом, приведенный выше пример станет (без ошибки обработки):