2017-05-18 4 views
0

Ich habe eine einzige Funktion, die Ajax-Aufrufe zum Abrufen von Daten macht. Das Problem, das ich habe, ist verschachtelte Ajax-Anrufe, bei denen ein Anruf von anderen und $ .wait() abhängt. Then() funktioniert nicht wirklich. Gibt es eine Lösung für mein Problem? Hier ist ein Beispiel ...

function _Ajax(params){ 
if(params == ''){ 
    alert('no post params'); 
    return; 
} 
var xdata; 
$.ajax({ 
    type: "POST", 
    url: "/xml/", 
    async: false, 
    data: params, 
    dataType: "xml", 
    success: function(xml){ 
     xdata = xml; 
    }, 
    error: function() { 
     alert("An error occurred while processing XML file. Params:" + objToString(params)); 
    } 
    }); 
    return xdata; 
} 

function A(a,b){ 
    _Ajax({a:a,b:b}); 
} 
function B(a,b,c){ 
    _Ajax({a:a,b:b,c:c}); 
} 
function C(a,b){ 
    A(a,b); 
    B(a,b); 
} 
function D(a,b){ 
    _Ajax({a:a,b:b}); 
} 
function E(){ 
    $.when(C(a,b)).then{function(){ D(a,b);}); 
} 

Ich habe auch versucht, async auf wahr zu ändern und es scheitert vollständig, ohne irgendwelche Daten zurückzugeben. Dank

+1

Mögliche Duplikat von [Wie Ich gebe die Antwort von einem asynchronen Anruf zurück?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Liam

+0

'return xdata;' is nicht zur Arbeit gehen – Liam

+0

'_Ajax' sollte das Ergebnis von' $ .ajax' zurückgeben 'A',' B' usw. muss das Ergebnis von '_Ajax' zurückgeben und der' Erfolg' muss außerhalb von all dem passieren. Grundsätzlich lesen Sie die Dupli Cate, es ist alles da – Liam

Antwort

1

$.when nicht auf magische Weise für etwas asynchron warten nicht, müssen Sie verspricht, um es passieren - und dafür, alle Ihre Funktionen müssen tatsächlich return sie:

function _Ajax(params){ 
    if(params == ''){ 
     return $.Deferred().reject('no post params').promise(); 
    } 
    return $.ajax({ 
     type: "POST", 
     url: "/xml/", 
     data: params, 
     dataType: "xml" 
    }).catch(function() { 
     throw "An error occurred while processing XML file. Params:" + objToString(params)); 
    }); 
} 

function A(a,b){ 
    return _Ajax({a:a,b:b}); 
} 
function B(a,b,c){ 
    return _Ajax({a:a,b:b,c:c}); 
} 
function C(a,b){ 
    return $.when(A(a,b), B(a,b)); 
} 
function D(a,b){ 
    return _Ajax({a:a,b:b}); 
} 
function E(){ 
    return C(a,b).then{function([xdata1], [xdata2]){ return D(a,b); }); 
} 
+0

Das größte Problem hier ist, dass _Ajax Funktion verspricht, aber ich brauche es auch XML-Ergebnis zurückgeben. Ich nehme an, eine der Lösungen ist, ein Array zurückzugeben? – Joseph

+0

@Joseph Es sollte ein Versprechen * für * das XML-Ergebnis zurückgeben, nicht wahr? Sie können über die Parameter Ihres 'then' Callbacks darauf zugreifen. Wo würdest du 'xdata' verwenden? – Bergi

+0

Es gibt Hunderte von vorhandenen Funktionen, die diesen xdata-Parameter auf unterschiedliche Weise verarbeiten ... – Joseph

Verwandte Themen