2016-11-09 53 views
-1

我想調用同步調用獲取數據使用ajax調用計數。獲取解析的數據undefined在jquery

這裏是我的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:未定義

同步調用,可以正常使用,但我得到的數據爲未定義

+2

您的來電是不同步的,在所有的 - 這是異步。另外,'tilesCount()'不會返回任何東西,所以我什至不知道你期望在這裏發生什麼? –

+0

^打我吧,但是,是的,因爲你沒有在你的異步調用中返回一個值,所以當你記錄「調用2」 – Jorrex

+0

ItemCount var ...時,它將始終未定義。 ..從來沒有在'tilesCount'函數之外使用...沒有意義 - 這裏有一個提示...'$ .ajax'返回一個承諾(各種),所以不需要延遲的反模式,你不完全正確。 –

回答

1

由於ajax是異步的return count;將爲空

var count = tilesCount(""); 

所以最好的解決方法就是通過你的方法中的回調函數可以調用,每當你的Ajax完成

function tilesCount(tilename, count, callback) 

總結這是你的回調函數內

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

所以你的$(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); 
     }); 
    }); 
});