4

特定のデータを取得するために消費者によって呼び出される非同期 JavaScript 関数を作成しています。以下は、私が最初に書いた単純な実装です (わかりやすくするために、エラー処理やその他のものは削除されています)。

function getData(callback){
    if (data is available as a JavaScript object){
        callback(data);
    }else{
        getAsyncData(function(data){
             //some transformations on data
             callback(data); 
        });
    }
}

注意すべき重要な点は、データが JavaScript オブジェクトとして既に使用可能な場合、getData はデータを迅速に返すことができるということです。

この実装を、promise オブジェクトを呼び出し元に返す実装に置き換えたいと考えています。このフィドルはサンプル実装を示しています - http://fiddle.jshell.net/ZjUg3/44/

質問 - getData はすぐに戻ることができるため、呼び出し元がthenメソッドを使用してハンドラー チェーンを確立する前であっても、getData がpromise を解決している可能性はありますか? これをシミュレートするために、フィドルで setTimeout 関数内のメソッドを呼び出した場合 (遅延なし)、コールバックは呼び出されませんsetTimeout 関数の外でthenメソッドを呼び出すと、コールバックが呼び出されます。これが有効な懸念または有効なユースケースであるかどうかはわかりません。私は angularjs の開発にまったく慣れていないので、ご意見をいただければ幸いです :)

4

2 に答える 2

3

いいえ、プロミスであることの重要かつ重要な部分は、ハンドラーをいつアタッチするかは問題ではないということです。Promise を今作成してすぐに解決したとしても、コンピューターを次の 50 年間実行し続けてから、ハンドラーをアタッチすると、それでも起動します。

これはすべて、angularjs の promise 実装にバグ/コーナー ケースがないことを前提としています。それでも動かない場合はバグです。

promiseがどのように機能するかについて何かを知る必要がある場合は、Angular が準拠しているPromises/A+ 仕様をいつでも参照できます。仕様として、これは私が見つけた中で最も単純で理解しやすいものの 1 つです (ただし、かなり長い間この仕様に携わってきたことは言及しておく必要があります)。

于 2013-07-25T12:01:09.483 に答える