webForumDet fria alternativet

retunera värde från ajax metod

JavaScript

3 svar · 970 visningar · startad av Dino

Medlem sedan sep. 20011 914 inlägg
Frågan#1

I en loop vill jag anropa en funktion som hämtar data via ajax som jag vill att den skall retunera till obj2 i loopen. Genom att sätta tredje parametern i xmlhttp.open till true så blir ju anropet asynkront och jag hade hoppats på att jag då kunde retunera värdet. Men det gick ju inte.
Så finns det något sätt att lösa detta på?

for (var i = 0; i < l; i++) {
    var obj= list[i];
    //do things with obj

    var obj2= getMore(obj.regionId);
    //do things with obj2
}

function getMore(regionid) {
    var DTO = { "regionid":  regionid}] };

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", '[URL]', true);
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
           [B] //Vill att detta skall vara funktionens return värde[/B]
            return JSON.parse(xmlhttp.responseText) || null;
        }
    };        
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    xmlhttp.setRequestHeader("X-Request", "JSON");
    xmlhttp.send('json=' + JSON.stringify(DTO));
}
Medlem sedan mars 20007 896 inlägg
#2

Standardförfarande är att man använder en callback-funktion, i och med att det sker ett asynkront anrop by-default.

Så funktionens signatur hade jag ändrat till:

function getMore(regionid, [b]callback[/b]) {
...

Och istället för att returnera ett värde, anropar du bara callback-funktionen med värdet som parameter:

...
if (xmlhttp.readyState == 4) {
    callback(JSON.parse(xmlhttp.responseText));
}
...

I din loop så blir då anropet:

for (var i = 0; i < 1; i++) {
    var obj = list[i];
    getMore(obj.regionId, [b]function(return_value) {
        // Do things with return_value
    }[/b]);
}
Medlem sedan juni 201161 inlägg
#3

Asynkronprogrammering kräver att man tänker lite annorlunda. Din funktion getMore har ju returnerat för länge sedan när svaret väl kommer. Det du har i din return är ju vad du ger XMLHTTP tillbaka när dess onreadystatechange event triggar. Vid det laget är din loop redan färdig.

Medlem sedan sep. 20011 914 inlägg
#4

Tackar SPiN

261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)