nodeJsコールバックの簡単な例を教えてもらえますか?私はすでに多くのWebサイトで同じものを検索しましたが、正しく理解できません。簡単な例を教えてください。
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
そんなことしたい...
nodeJsコールバックの簡単な例を教えてもらえますか?私はすでに多くのWebサイトで同じものを検索しましたが、正しく理解できません。簡単な例を教えてください。
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
そんなことしたい...
回答:
var myCallback = function(data) {
console.log('got data: '+data);
};
var usingItNow = function(callback) {
callback('get it?');
};
次に、ノードまたはブラウザコンソールを開き、上記の定義を貼り付けます。
最後に、次の行で使用します。
usingItNow(myCallback);
ノードスタイルのエラー規約に関して
Costaは、ノードエラーコールバック規則を尊重するとどうなるかを尋ねました。
この規則では、コールバックは少なくとも1つの引数、最初の引数をエラーとして受け取ることを期待する必要があります。オプションで、コンテキストに応じて、1つ以上の追加の引数があります。この場合、コンテキストは上記の例です。
ここで、この規則の例を書き直します。
var myCallback = function(err, data) {
if (err) throw err; // Check for the error and throw if it exists.
console.log('got data: '+data); // Otherwise proceed as usual.
};
var usingItNow = function(callback) {
callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument
};
エラーケースをシミュレートする場合は、次のようにusingItNowを定義できます。
var usingItNow = function(callback) {
var myError = new Error('My custom error!');
callback(myError, 'get it?'); // I send my error as the first argument.
};
最終的な使い方は上記とまったく同じです。
usingItNow(myCallback);
動作の唯一の違いは、usingItNow
定義したバージョンに依存します。「真の値」(Errorオブジェクト)を最初の引数のコールバックにフィードするもの、またはエラー引数のnullをフィードするもの。
コールバック関数は、後で別の関数を呼び出すことができるように、単に別の関数に渡す関数です。これは一般的に非同期APIで見られます。API呼び出しは非同期であるため、すぐに戻ります。非同期タスクの実行が完了したときにAPIが呼び出すことができる関数をその関数に渡します。
JavaScriptで考えることができる最も単純な例はsetTimeout()
関数です。これは、2つの引数を受け入れるグローバル関数です。最初の引数はコールバック関数で、2番目の引数はミリ秒単位の遅延です。この関数は、適切な時間待機してからコールバック関数を呼び出すように設計されています。
setTimeout(function () {
console.log("10 seconds later...");
}, 10000);
前に上記のコードを見たことがあるかもしれませんが、渡した関数がコールバック関数と呼ばれていることに気づかなかっただけです。上記のコードを書き直して、わかりやすくすることができます。
var callback = function () {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
Nodeはすべての場所で非同期になるようにゼロから構築されているため、コールバックはNodeのあらゆる場所で使用されます。ファイルシステムと話しているときでも。そのため、多くの内部Node APIは、変数に割り当てることができるデータを返すのではなく、コールバック関数を引数として受け入れます。代わりに、コールバック関数を呼び出し、必要なデータを引数として渡します。たとえば、Nodeのfs
ライブラリを使用してファイルを読み取ることができます。fs
モジュールは、2つの固有のAPI関数を公開しますreadFile
とreadFileSync
。
readFile
一方、関数は非同期でreadFileSync
明らかではありません。あなたは、彼らがそれらを呼ばれるので、可能な限り非同期呼び出しを使用するためにあなたを意図していることがわかりますreadFile
し、readFileSync
代わりにreadFile
とreadFileAsync
。両方の関数を使用する例を次に示します。
同期:
var data = fs.readFileSync('test.txt');
console.log(data);
上記のコードは、のすべての内容がtest.txt
メモリに読み込まれて変数に格納されるまで、スレッドの実行をブロックしますdata
。ノードでは、これは通常、悪い習慣と見なされます。ただし、簡単で面倒なことを行う簡単なスクリプトを作成する場合など、便利な場合もあり、ナノ秒単位で節約できる時間をあまり気にしません。
非同期(コールバックあり):
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
まず、2つの引数err
とを受け入れるコールバック関数を作成しますdata
。非同期関数の1つの問題は、エラーをトラップすることがより困難になるため、多くのコールバックスタイルAPIがエラーをコールバック関数の最初の引数として渡すことです。err
他に何かを行う前に、が値を持っているかどうかを確認することをお勧めします。その場合、コールバックの実行を停止し、エラーをログに記録します。
同期呼び出しは、例外をスローするときにtry/catch
ブロックでキャッチできるので便利です。
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
非同期関数では、そのようには機能しません。API呼び出しはすぐに戻るので、でキャッチするものはありませんtry/catch
。コールバックを使用する適切な非同期APIは、常に独自のエラーをキャッチしてから、それらのエラーをコールバックに渡し、必要に応じて処理できるようにします。
ただし、コールバックに加えて、一般的に使用されているもう1つの一般的なAPIスタイルには、promiseと呼ばれるものがあります。それらについて読みたい場合は、この回答に基づいて私が書いたブログ投稿全体をここで読むことができます。
fs.readFile
andでテキストファイルをコピーする例を次に示しますfs.writeFile
。
var fs = require('fs');
var copyFile = function(source, destination, next) {
// we should read source file first
fs.readFile(source, function(err, data) {
if (err) return next(err); // error occurred
// now we can write data to destination file
fs.writeFile(destination, data, next);
});
};
そしてそれはcopyFile
関数の使用例です:
copyFile('foo.txt', 'bar.txt', function(err) {
if (err) {
// either fs.readFile or fs.writeFile returned an error
console.log(err.stack || err);
} else {
console.log('Success!');
}
});
共通のnode.jsパターンは、コールバック関数の最初の引数がエラーであることを示唆しています。すべての制御フローモジュールがそれに依存しているため、このパターンを使用する必要があります。
next(new Error('I cannot do it!')); // error
next(null, results); // no error occurred, return result
const fs = require('fs');
fs.stat('input.txt', function (err, stats) {
if(err){
console.log(err);
} else {
console.log(stats);
console.log('Completed Reading File');
}
});
「fs」は、ファイルの読み取りに役立つノードモジュールです。コールバック関数は、「input.txt」という名前のファイルが実行される前に完全に読み取られることを確認します。fs.stat()関数は、ファイルサイズ、作成日、変更日などのファイル情報を取得します。
このブログ投稿には良い記事があります:
https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
function alertFinished(){
alert('Finished my homework');
}
doHomework('math', alertFinished);