1. ホーム
  2. javascript

[解決済み] Node.jsのための非同期関数の書き方

2022-09-17 11:54:21

質問

非同期関数は具体的にどのように書けばいいのか調べてみました。多くのドキュメントに目を通した後、私にはまだ不明です。

Nodeのために非同期関数をどのように書けばよいのでしょうか?エラーイベント処理を正しく実装するにはどうしたらよいでしょうか。

私の質問をする別の方法はこうです。次の関数をどのように解釈すべきですか?

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

また に関するこの質問は、SO ("How do I create a non-blocking asynchronous function in node.js?") 面白いですね。まだ回答されていないような気がします。

どのように解決するのですか?

非同期IOと非同期関数を混同しているようです。node.jsはノンブロッキングIOの方が良いので、非同期ノンブロッキングIOを使用します。ライアン・ダールのビデオを見ていただくのが一番わかりやすいと思います。

Nodeの非同期関数はどのように書けばいいのでしょうか?

通常の関数を書くだけです。唯一の違いは、すぐに実行されず、コールバックとして渡されることです。

<ブロッククオート

エラーイベント処理を正しく実装するにはどうしたらよいでしょうか?

一般的にAPIは、errを第一引数にしたコールバックを与えます。例えば

database.query('something', function(err, result) {
  if (err) handle(err);
  doSomething(result);
});

はよくあるパターンです。

もう一つのよくあるパターンは on('error') . 例えば

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

編集します。

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

として呼び出された場合、上記の関数は

async_function(42, function(val) {
  console.log(val)
});
console.log(43);

印刷する 42 を非同期でコンソールに出力します。特に process.nextTick は、現在のイベントループのコールスタックが空になった後に起動されます。そのコールスタックが空になるのは async_functionconsole.log(43) が実行されました。そこで、43の後に42をプリントします。

イベントループについて少し読んでおくといいでしょう。