Async: async / awaitでasyncを機能させる方法

作成日 2019年02月14日  ·  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/

非同期は、ノードスタイルのコールバック関数を受け入れる場合は常に非同期関数を受け入れます。 ただし、コールバックを渡さず、代わりに戻り値を使用して、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を返さないだけ

このページは役に立ちましたか?
0 / 5 - 0 評価