Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Асинхронное программирование. (https://javascript.ru/forum/misc/61802-asinkhronnoe-programmirovanie.html)

Landgraf 09.03.2016 20:21

Асинхронное программирование.
 
Что я хочу сделать: при получении массива диалогов я хочу по полученному id получать имя пользователя. Так как функция не сразу возвращает имя, я получаю undefined в нужный мне момент. Как правильно решить такую задачу? Я не знаю как это можно решить callback'ом к сожалению. Разве что при успешной загрузке изменять состояние переменной и если эта переменная изменена, выводить диалоги и имена.

function loadAccountInfo(url) {
var fname_global;
    fname_global="nothing :(";
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) {
            fname_global=parseJSON(xmlhttp.responseText);
            

        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
return fname_global;

}

function parseJSON(response) {
    var arr = JSON.parse(response);
    var fName;
    fName=arr.response[0].first_name;
    return fName;

}



function loadDialogs(url) {

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) {
            parseJSON3(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}
var dialogArray = new Array();

function parseJSON3(response) {

     console.log(response);
    console.log("dialogs: ");
    var arr = JSON.parse(response);


    for(var i = 1; i < arr.response[0]; i++) {
        try {

console.info('uid' in arr.response[i], " № "+i);
dialogArray.push({uid:arr.response[i].uid,
                                 body:arr.response[i].body,
mid:arr.response[i].mid,
 read_state:arr.response[i].read_state,
                     out:arr.response[i].out,
                     date:arr.response[i].date,
                    title:arr.response[i].title
                             });

        }
catch (e) {
console.log("Debug warning");
}
    }
    var name;
    var nameArray=new Array();
      for(var i = 1; i < 15; i++) {
          name=loadAccountInfo("https://api.vk.com/method/users.get?user_id="+dialogArray[i].uid);

}
      for(var i = 1; i < 15; i++)
        nameArray.push(name);
       for(var i = 1; i < 15; i++)
console.log(name+" "+dialogArray[i].body+" "+dialogArray[i].date);

}

Deff 10.03.2016 01:56

Landgraf,
Один из вариантов тупого велосипеда кликнуть программно скрытую кнопку,
вставив перед этим данные в атрибут кнопки data-mygetajax="данные"
Тоже самое можно сделать, вызвав по получению аякса новую, заранее определённую функцию, передав ей данные, как параметры
==============
И да, максимальное число незавершенных запросов - 5, если может быть более, нужно строить очередь с ожиданием завершения первых пяти


Часовой пояс GMT +3, время: 06:12.