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/
非同期は、ノードスタイルのコールバック関数を受け入れる場合は常に非同期関数を受け入れます。 ただし、コールバックを渡さず、代わりに戻り値を使用して、promiseの拒否またはスローされたエラーを処理します。
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
関数にコールバックを渡しません-タスクが完了したときに戻るだけです。
そして、(この例のようにコンソールログの代わりに)最後のコールバック関数から値を返すのはどうですか?
ほとんどの場合、 async
関数からのreturn
ing値だけが機能します。
どのasync
関数が正確に値を返しますか? 私がチェックしたものから、彼らは無効を返します、例えば
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!
})
多分あなたはneo-asyncを試すことができます
@kazaffかっこいい、知らなかった、ありがとう!
@kazaff Legend!
@kazaff b4dnewzの回答でneo-asyncを使用する方法、reulstを返さないだけ
最も参考になるコメント
@pawelotto node promisify utilを使用できると思います。テストはしていませんが、メインのコールバック関数のシグネチャには互換性があるため、機能すると思います。
したがって、上記の例は(エラーを処理せずに)次のようになります。