私は現在いくつかの非同期呼び出しを行い、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);
}
これは私がload
とready
に複数のコールを処理することができます。
これを更新して、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()
は同じ値を返さないことがあります)。
私は数回かかりましたが、私は理解していると思います。私が間違っていれば私を訂正してください(私は「その時」という順序で考えていました)。最初の 'Promise'が解決されると、それはその状態を維持するので、' then'を呼び出すと 'asyncResult'で自動的に成功ハンドラが呼び出されます。私はちょうどそれを保持し、ローカルコピーを返す必要があります。 – Twifty
あなたはそれを正確に持っています。それは、makeAsyncCalls promiseが何を解決するものであれ、成功ハンドラを呼び出すでしょう。 – danh
ありがとうございます。ちょっと今、少しばかだと感じる。 – Twifty