以下は「A note on using Promises and Callbacks」ページの翻訳文です。
ml5.jsは、p5.jsライブラリのシンタックスやパターン、スタイルに強い影響を受けていますが、ml5.jsが行う非同期操作の処理方法において相違があります。それは、ml5.jsはエラーファーストコールバックとPromiseをすべてのメソッドでサポートするという点です。
コールバック関数の使用
p5.jsでは、コールバック関数は通常、何らかの非同期操作を行う関数の引数として渡されます。たとえば、p5.jsではloadJSON()関数は次のように定義されています。
loadJSON('http//example.com/data.json', function (results) {
// resultsを使って何かする
});
p5.jsでは、コールバック関数からの結果は関数への唯一の引数として与えられることに注目してください。このコールバック関数にはエラーの引数はありません。
これに対しml5.jsでは、エラーファーストコールバックと呼ばれるパターンが使用されます。
このパターンでは、コールバック関数は引数としてメソッドに渡されます。コールバック関数は操作が完了したときもエラーが発生したときも呼び出されます。エラーが発生したときには1つめの引数として渡されるErrorオブジェクトとともに呼び出され、エラーが発生しなかったときには、1つめの引数はnullとして渡されます。[Node.jsドキュメンテーションからの引用 ]
たとえば、imageClassifier()メソッドを使用する場合には、次のように構成する必要があります。
// imageClassifier()にコールバック関数を渡す
const classifier = ml5.imageClassifier('MobileNet', function(err, model) {
console.log('モデルがロードされた');
}
// 選択された画像で推測を行うとき、引数を2つ取るコールバック関数を渡す
classifier.predict(image, function(err, results) {
// エラーをチェックする。エラーがないなら、resultsで何かする
});
エラーファーストコールバックは、多くのJavaScriptライブラリで使用される慣習で、JavaScript言語自体が強制するパターンではありません。ただし、ml5.jsのメソッドや関数の大部分は非同期だということは覚えておいてください(機械学習モデルが入力を処理し出力を生成するには、かなりの時間がかかるのです)。コールバック関数を使いたい場合には、エラーファーストコールバックを使用する必要があります。
Promiseの使用
ml5.jsはまたPromiseもサポートします。非同期関数にコールバックが与えられない場合には、Promiseが返されます。
Promiseは画像分類サンプルでは次のように使用できます。
// Promiseを使うときにはコールバック関数は不要
ml5.imageClassifier('MobileNet')
.then(classifier => classifier.predict(image))
.then(results => {
// resultsで何かする
});
Promiseに関するビデオチュートリアルは、このCoding Trainプレイリストで見つけることができます。またES6の矢印記法(=>)についてのビデオチュートリアルもあります。