Phoenix Webアプリケーションからデータをダウンロードして、フロントエンドでデータをレンダリングしようとしています。このために、私はリスト内で要求とコールバックを持っており、それに対してリストを実行しています。それに対して、各リクエストはthen
です。jQueryを使用した機能的約束
var Database = function() {
this.reservations = [];
this.applications = [];
this.environments = [];
};
var database = new Database();
var requests = [$.getJSON('/api/applications', data => { database.applications = data }),
$.getJSON('/api/environments', data => { database.environments = data }),
$.getJSON('/api/reservations', data => { database.reservations = data })];
function run() {
requests.reduce(function(chain, callback) {
return (chain ? chain.then(callback) : callback);
}, null).then(() => render(database));
}
ただし、これはほとんどの場合、Google Chromeの最新バージョンで動作し、おそらくSafariでは10%です。
レンダリング機能に入った後で「データベース」を調べると、アプリケーションの一覧は表示されますが、環境や予約(2つのデータ)は表示されません。
編集:これはGoogle Chromeの通常モードで動作します。しかし、シークレットモードでは常に動作しません。 Safariでは、3つすべてのデータを取得することがあり、場合によっては2つのデータしか取得しないこともあります。私のアプリケーションはセッションを使用しません。
私はこれが$ .ajaxの性質が非同期であり、私の約束を破ったことが原因であると推測しています。しかし、私はロードブロッキングを打った。
洞察?
だろうではない、あなただけの 'Promise.all(リクエスト).then(()=>レンダリング(データベース));' - すべて –
のマップは必要ありません - 要求として見することは約束の配列でありますはい、あなたが正しい。私は '$ .getJSON()'呼び出しを見逃してしまい、リクエストを行うために使用されるデータオブジェクトだけであると考えました。 – Soviut
私は問題を解決するための洞察を私に提供したので、これを答えとしてマークしましたが、ちょっと違う方法で修正しました。 @Soviut – hyde