2016-11-09 4 views
-1

ajax呼び出しを使用してデータを取得するための同期呼び出しを呼び出そうとしています。jqueryで未解決のデータを取得する

var baseurl = _spPageContextInfo.webServerRelativeUrl; 
console.log(baseurl); 
var ItemCount = $.Deferred(); 

function tilesCount(tilename, count) 
{ 
    var url = baseurl + "/_api/web/lists/getByTitle('policies')/rootFolder/Folders?$expand=ListItemAllFields"; 
    count = 0; 

    $.ajax({ 
     url: url, 
     dataType: 'json', 
     success: function(data) { 
      $(data.value).each(function (i, folder) { 
       count = count + 1; 
      }); 
      console.log("Call 1: " + count) 
      ItemCount.resolve(count); 
      return count; 
     }, 
     error: function(error){ 
      console.log("Error: " + JSON.stringify(error)); 
      ItemCount.reject; 
     } 
    }); 
} 

$(document).ready(function() { 
    var count = tilesCount(""); 
    $.when(count).then(function(data){ 
     console.log("Call 2: " + data); 
    }); 
}); 

出力:
コール1:1
電話2:ここでは

は私のjqueryのコードで完璧に働い未定義

同期呼び出しが、私は未定義

としてデータを取得しています
+2

次のようになりますあなたの呼び出しは、すべての同期ではありません - それは非同期です。また、 'tilesCount()'は何も返さないので、ここで何が起こると思いますか? –

+0

^非公式な呼び出しで値を返さないので、「コール2」をログに記録するときに値が返されないので、それを聞いてください。 – Jorrex

+0

ItemCount var ...をDeferred ...に設定します。 .. tilesCount'関数の外で決して使用されていません...無意味です - ここにヒントがあります... '$ .ajax'は約束を返しますので、遅延防止パターンは必要ありません。 。 –

答えて

1

ajaxは非同期であるため、return count;は空になります

var count = tilesCount(""); 

だから最善の解決策は、ちょうどあなたのアヤックスは、このコールバック関数の内部

function(count) { 
    $.when(count).then(function(data){ 
     console.log("Call 2: " + data); 
    }); 
} 

ので、ラップ

function tilesCount(tilename, count, callback) 

を終了するたびに呼び出すことができ、あなたのメソッド内でコールバック関数を渡すことです $(document).readyはこのようになり、コールバック内にパラメータ countを追加するだけです。

$(document).ready(function() { 
    tilesCount("", "", function(count) { 
     $.when(count).then(function(data){ 
      console.log("Call 2: " + data); 
     }); 
    }); 
}); 

あなたのjavascriptのコードは今

var baseurl = _spPageContextInfo.webServerRelativeUrl; 
console.log(baseurl); 
var ItemCount = $.Deferred(); 

function tilesCount(tilename, count, callback) 
{ 
    var url = baseurl + "/_api/web/lists/getByTitle('policies')/rootFolder/Folders?$expand=ListItemAllFields"; 
    count = 0; 

    $.ajax({ 
     url: url, 
     dataType: 'json', 
     success: function(data) { 
      $(data.value).each(function (i, folder) { 
       count = count + 1; 
      }); 
      console.log("Call 1: " + count) 
      ItemCount.resolve(count); 
      return callback(count); 
     }, 
     error: function(error){ 
      console.log("Error: " + JSON.stringify(error)); 
      ItemCount.reject; 
     } 
    }); 
} 

$(document).ready(function() { 
    tilesCount("", "", function(count) { 
     $.when(count).then(function(data){ 
      console.log("Call 2: " + data); 
     }); 
    }); 
}); 
関連する問題