@pr0kazn1k

Как решаются стандартные проблемы с асинхронностью javascript?

Какие изменения необходимо внести чтобы, в r уже лежал массив после вызова метода get, проблема в том, что метод может отрабатывать до 2 секунд. Так же необходимо использовать класс, так как есть еще методы. Возможно, что это ужасный код, но он по крайне мере работает. Буду очень благодарен, если вы дадите несколько советов.

function Class(){
    this.result;
}

Class.prototype.get = function(){
    play();
        
    function play(){
        /*Запросы, выполняются какое-то время*/
        setTimeout(function(){
            this.result = 'array';
        }, 1500);
    }
    
    return this.result;
}

c = new Class();
r = c.get();
// необходимо чтобы в r уже лежал array
console.log(r);
  • Вопрос задан
  • 2229 просмотров
Пригласить эксперта
Ответы на вопрос 3
@an23
Используй Deffered object.
api.jquery.com/category/deferred-object
В твое случае
function Class(){
    this.result;
}

Class.prototype.get = function(){
    var dfd = new jQuery.Deferred();
    play();
        
    function play(){
        /*Запросы, выполняются какое-то время*/
        setTimeout(function(){
            this.result = 'array';
            dfd.resolve(this.result);
        }, 1500);
    }
    
    return dfd.promise();
}

c = new Class();

$.when(c.get()).done(function(res) {
    var r = res;
    console.log(r);
});


Пример с использованием Jquery Deffered
Ответ написан
Здравствуйте

Например так
function Class(){
    this.result;
}

Class.prototype.get = function(onComplete){
    play();
        
    function play(){
        /*Запросы, выполняются какое-то время*/
        setTimeout(function(){
            this.result = 'array';
            onComplete(this.result);
        }, 1500);
    }
}

c = new Class();
c.get(
	function(result){ console.log(result); }
);
// необходимо чтобы в r уже лежал array
Ответ написан
mainameiz
@mainameiz
Full-stack web-developer
Если я правильно помню, о в js можно сделать синхронный запрос, т.е. страница и ваш скрипт "зависнет" на время выполнения запроса. Если же вы хотите использовать именно setTimeout, то без коллбэков не обойтись.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы