2016-03-29 13 views
0

2つのjQuery AJAX呼び出しの結果をマージしようとしています。私はここで他の同様の質問を見てきましたが、誰も助けてくれないようです。それぞれのAjax呼び出し(2つ)について、関数createStatusViewを呼び出すと成功し、結果を渡します。良い点は、結果が両方のAJAX呼び出しで機能することです。悪いニュースは、私の$ .when呼び出しがres1とres2の両方に対して未定義を返し、結果が未定義のものを私のcreateStatusViewに送るということです。ですから、私は本当に両方のAJAX呼び出しのcreateStatusViewを呼びたくはなく、$ .whenだけを呼び出すことにします。どんな勧告も高く評価されます。2つのjQuery AJAX呼び出しの結果をマージし、遅延/約束を使用する方法

function getSpecifiedList(listName, userId){ 

    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName; 

    var url1 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages";  
    var call1 = $.ajax({ 
     url: url1, 
     type: "GET", 
     headers:{"accept":"application/json;odata=verbose", 
     }, 
     success: function(results){createStatusView(results, listName);}, 
     error:function(error){ 
      console.log("Error in getting List: " + listName); 
      $(_options.container).html("Error retrieving your " + listName + ". " + 
      SP.PageContextInfo.get_webServerRelativeUrl()); 
     } 
    }); 

    var url2 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages&$skiptoken=1000"; 
    var call2 = $.ajax({ 
     url: url2, 
     type: "GET", 
     headers:{"accept":"application/json;odata=verbose", 
     }, 
     success: function(results){createStatusView(results, listName);}, 
     error:function(error){ 
      console.log("Error in getting List: " + listName); 
      $(_options.container).html("Error retrieving your " + listName + ". " + 
      SP.PageContextInfo.get_webServerRelativeUrl()); 
     } 
    }); 
    //the res1 and res2 come back undefined 
      //call1 and call2 are objects as shown in F12 debug 
    $.when(call1,call2).done(function(res1,res2){ 
     var results = res1[0].d.results.concat(res2[0].d.results); 
     createStatusView(results,listName); 
    }); 
} 
+0

はcreateStatusViewを返すために何を想定していますか?あなたの$ .ajax成功ハンドラが呼び出し側に何も返さない... '$ .when.done'コールバックにajax呼び出しから返されたデータを渡したいのですか? –

+0

createStatusViewはデータまたはこの場合は結果を処理してWebページに表示します。それは動作しますが、コードの余分な量のためにそれを含めることを望んでいませんでした。 AJAX呼び出しが正しく動作するかどうかを$コメントすると、唯一の問題はcreateStatusViewで行われる処理が2回発生するのではなく、2つの異なるデータがページに表示されることです。結果をマージしてまとめて処理して、レイアウトとロジックが正しく動作するようにしたいと考えています。 –

答えて

0

ajaxコールを別々の関数に移動して、それらの関数を呼び出してみましたか?

function getSpecifiedList(listName, userId){ 
    $.when(call1(listName),call2(listName)).then(function(res1,res2){ 
     var results = res1[0].d.results.concat(res2[0].d.results); 
     createStatusView(results,listName); 
    }); 
} 

function call1(listName){ 
    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName; 
    var url1 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages"; 

    return $.ajax({ 
     url: url1, 
     type: "GET", 
     headers:{ 
      "accept":"application/json;odata=verbose", 
     } 
    }); 
}; 

function call2(listName){ 
    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName; 
    var url2 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages&$skiptoken=1000"; 
    return $.ajax({ 
     url: url2, 
     type: "GET", 
     headers:{ 
      "accept":"application/json;odata=verbose", 
     } 
    }); 
}; 
+0

これはすでに試みていました。結果は次のとおりです。未定義またはnull参照のプロパティ 'results'を取得できません –

1

$ .whenコールバック関数にオブジェクト検出を追加してみてください。定義されていない値はリストから削除されます。

$.when(call1,call2).done(function(res1,res2){ 
    var results = res1[0].d.results.concat(res2[0].d.results); 
    if (results) { 
     createStatusView(results,listName); 
    } 
}); 

別の例:これと同じである

$.when(call1,call2).done(function(res1,res2){ 
    if (!res1 && !res2) return; 
    var results = res1[0].d.results.concat(res2[0].d.results); 
    if (results) { 
     createStatusView(results,listName); 
    } 
}); 

$.when(call1,call2).done(function(res1,res2){ 
    if (res1 && res2) { 
     var results = res1[0].d.results.concat(res2[0].d.results); 
     if (results) { 
     createStatusView(results,listName); 
     } 
    } 
}); 
+0

いくつかのテストを追加しましたが、問題の解決には役立ちませんでした。 –

+0

私はあなたが本当に求めていることを見ていると思います。次のように2つのオブジェクトをマージする方法を探しています: 'var mergedResults = $ .extend({}、model.ajax1Results、model.ajax2Results); createStatusView(mergedResults、listName); 'このjsfiddleには、3つのオプションから拡張回答を追加しましたが、それらはすべて追加コードが必要です:https://jsfiddle.net/briankueck/tpgzbax4/コアコンポーネントはjQueryの$ .extend()関数です。私のjsfiddleは、両方のAjaxコールバックを追跡し、createStatusView関数をマージされた結果とともに1回だけ実行する方法を示しています。 – Clomp

+0

あなたのjsfiddleから、私の殆どが働いています。私のmergeCallbacks呼び出しのために、 "ajax1Results"と "ajax2Results"のキーを追加しなければなりませんでした。今私はmergeCallbacks関数にあり、$ .extendまで動作します。 $ .extendが機能していないと、mergeResultsにはresult = ajax2Resultsに25個のオブジェクト(1025になるはずです)が含まれています。 ajax1Resultsが無視または上書きされています。私も$ .extend(ajax1Results、ajax2Results)をやってみましたが、まだajax2Resultsしか取得していません。私はajax1Resultsとajax2Resultsを並べ替え、オブジェクト配列内の1000個のオブジェクトを逆にします。 Thx –

関連する問題