2016-09-01 10 views
1

私は現在いくつかの非同期呼び出しを行い、DOMに要素を追加してからユーザーコールバックを呼び出すjavascriptクラスを持っています。このような何か:約束が既に実行されているときに約束を返すのをどのように処理するのですか?

api.load = function() { 
    if (api.loading || api.loaded) 
     return; 

    api.loading = true; 
    makeAsyncCalls(); // will set api.loaded = true and run all pendingReady 
} 

api.ready = function(callback) { 
    if (!api.loaded) { 
     pendingReady.push(callback); 
    } 
    callback(someValue); 
} 

これは私がloadreadyに複数のコールを処理することができます。

これを更新して、javacripts Promiseを利用しようとしています。私は最初の約束を始めたが、まだ完全にロードされていないケースを処理する方法がわからない

api.load = function() { 
    if (api.loaded) { 
     // callers attached .then() will still fire 
     return Promise.resolve(someValue); 
    } 

    if (api.loading) { 
     // Not sure how to handle this 
    } 

    api.loading = true; 
    return makeAsyncCalls(); // Which returns a Promise 
} 

(約束のスピーチで解決):上記のコードは、何かのようになります。私が考えることができる唯一の方法は、setIntervalへの呼び出しをラップするPromiseを返すことです。確かに良い方法があります。助言がありますか?

これをより明確にする。 api.loadへのすべての通話は、Promiseまたはthenableを返す必要があります。最初の呼び出しは非同期メソッドを開始します。さらなるコールはPromiseを返す必要があります。Promiseが完了した後に解決または拒否することができます。

成功ハンドラに値が渡されない場合にのみ、約定が連鎖されます(最初の.then()は同じ値を返さないことがあります)。

答えて

1

約束自体はいつでも発信者の任意の数の

api.getAsyncResult = function() { 
    if (!api.asyncResult) { 
     api.asyncResult = makeAsyncCalls(); 
    } 
    return api.asyncResult; 
} 

...スタンドで非同期的に受信されたデータのためにすることができ、今言うことがあります。

api.getAsyncResult().then(function(result) { 
    // use result, which is whatever makeAsyncCalls's promise resolves to 
}); 

最初の呼び出し非同期作業を開始します。後続の呼び出し(同じ形式)は、返された約束にthenを連結します。約束の完了に引き続いて、それはそれはあなたがそれを必要とする場合api.loadingフラグの状態を維持することができるthen()

makeAsyncCalls()関数に渡された関数へのパラメータとして値を解決しています提供していきます。冗長な呼び出しから守ることだけが目的ならば、api.loadedフラグは必要ありません(get関数での偽のチェックはそれを行います)。

+0

私は数回かかりましたが、私は理解していると思います。私が間違っていれば私を訂正してください(私は「その時」という順序で考えていました)。最初の 'Promise'が解決されると、それはその状態を維持するので、' then'を呼び出すと 'asyncResult'で自動的に成功ハンドラが呼び出されます。私はちょうどそれを保持し、ローカルコピーを返す必要があります。 – Twifty

+0

あなたはそれを正確に持っています。それは、makeAsyncCalls promiseが何を解決するものであれ、成功ハンドラを呼び出すでしょう。 – danh

+0

ありがとうございます。ちょっと今、少しばかだと感じる。 – Twifty

関連する問題