2016-11-16 7 views
0

を返します。この関数は応答をフェッチしてのlocalStorageライティングのAJAX呼び出しを行う方法が約束

function getSomething() { 
    var d = $.Deferred(); 
    var payload = ... 
    $.post(API, payload).done(function (data) { 
     // addData is a wrapper for localStorage write 
     addData(payload); 
     d.resolve(); 
    }).fail(d.reject); 
    return $.when(d).done(function() { 
     console.log('API fetch OK'); 
    }).promise(); 
} 

への応答を書き込みのlocalStorageに応じそしてdocument.ready、次の実行に

getSomething().done(function() { 
    // getData is a wrapper for localStorage read 
    var fs = $.grep(getData(), function (i) { 
     return i.cid == getID(); 
    });    

    var fso = JSON.parse(fs[0].data); 

    $('.button-list').each(function (i, v) { 
     var buttonRow = ''; 
     for (i = 0 ; i < fso.length ; i++) { 
      buttonRow += '<a id=' + getID() + '-' + fso[i].Content.Id + ' class=\'btn btn-default\'>' + fso[i].Form.Name + '</a>'; 
     } 
     $(v).html(buttonRow); 
    }); 

ここでの問題は、getSomething()を呼び出す前に何かが既にlocalStorageに存在するかどうかをチェックする2つの関数の間に別の関数を追加したいということです。これは、localStorageに書き込まれる前にgetSomethingが '完了'されているために失敗します。私はlocalStorageがgetSomethingが完了した後200msを読むことができることを発見した。

私の質問 - はgetSomethingが「完了」状態に入る前のlocalStorageが書き込まれている保証することは可能ですか?

ありがとうございました!ここで

+0

第1の質問なぜlocalStorageが必要なのですか。第2の質問なぜあなたは約束を必要としますか? – madalinivascu

+0

だから、(a)localStorageは、AJAX呼び出しから得られたデータを再利用するJSが多く、約束なしに要素を描画できないためです。 HTTP要求がまだ完了していないため、getData()が空であるため、** fs **を定義する行は失敗します。 –

+0

は、私は希望あなたのAJAX呼び出し – madalinivascu

答えて

0

これはDeferredオブジェクト

  • それは約束を返す$.ajaxコールを使用していますを使用していますgetSomething

    • への代替パスを作るためのlocalStorageや繰延オブジェクトを活用する方法です。
    • その後、 呼び出しが行われているAPIた後localStorageアイテムを移入するために呼び出す使用します。

    var url = "https://jsonplaceholder.typicode.com/posts/1";

    function getSomething() { 
        var d = $.Deferred(); 
        var storageResult = checkStorage(); 
        debugger; 
        if (storageResult) { 
        console.log("Found in Storage"); 
        return d.resolve(
         storageResult 
        ).promise(); 
        } else { 
        return callAPI();  
        } 
    } 
    
    callAPI = function(){ 
    var url = "https://jsonplaceholder.typicode.com/posts/1"; 
    return $.ajax({ 
         url : url 
        }).then(function(data, textStatus, promise){ 
         debugger; 
         console.log("Made an API call"); 
         addDataToStorage(data); 
         return promise; 
        }).fail(function() { 
         //fail handler 
        }); 
    } 
    
    addDataToStorage = function(data) { 
        localStorage.setItem("tpiCode", data); 
        console.log("Added to Storage"); 
    } 
    
    
    checkStorage = function() { 
        if (localStorage.getItem("tpiCode")) { 
        return localStorage.getItem("tpiCode"); 
        } 
    } 
    
    var obj = getSomething(); 
    debugger; 
    obj.done(function(data) { 
        $("result").html(JSON.stringify(data)); 
    }); 
    
  • +0

    多くのありがとう@冬の兵士 –

    関連する問題