2016-11-09 5 views
-1

Ich versuche, synchronen Aufruf für das Abrufen von Daten mit Ajax-Aufruf aufzurufen.Auflösung von Daten undefiniert in jquery

Hier ist mein JQuery-Code:

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); 
    }); 
}); 

Ausgang:
Anruf 1: 1
Call 2: undefined

Synchron Anruf funktionierend, aber ich bin immer Daten als undefiniert

+2

Ihr Anruf wäre, ist überhaupt nicht synchron - es ist async. Außerdem gibt 'tilesCount()' nichts zurück, also bin ich mir nicht einmal sicher, was Sie hier erwarten? –

+0

^Beat mich dazu, aber ja, da Sie nicht geben Sie einen Wert in Ihrem Async-Aufruf wird immer undefiniert sein, wenn Sie "Call 2" – Jorrex

+0

ItemCount var ... auf eine verzögerte ... dann eingestellt. .. nie außerhalb der 'tilesCount' Funktion verwendet ... sinnlos - hier ist ein Tipp ...' $ .ajax' gibt ein Versprechen (von Art), so dass keine Notwendigkeit für die verzögerte Anti-Muster, die Sie nicht richtig richtig . –

Antwort

1

Da Ajax asynchron ist return count; wird leer sein

var count = tilesCount(""); 

So ist die beste Lösung ist, nur eine Callback-Funktion in Ihrem Methode übergeben, die rufen werden können, wenn Ihre Ajax

abgeschlossen ist
function tilesCount(tilename, count, callback) 

Wrap dieses innerhalb Ihrer Callback-Funktion

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

so Ihr $(document).ready wird so sein und nur den Parameter count innerhalb des Rückrufs

012 hinzufügen

Ihren JavaScript-Code wie dieser jetzt

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); 
     }); 
    }); 
}); 
Verwandte Themen