результат асинхронной функции в JavaScript - PullRequest
0 голосов
/ 03 мая 2018

предупреждение: этот вопрос пытается быть общим, поэтому я использую псевдокод. Это скорее техника, чем реальное решение очень специфической проблемы.

Моя проблема в том, что у меня есть функция, которая выполняет несколько асинхронных вызовов на сервер для сбора информации, и я хочу использовать результат этой функции в другой функции. Как можно умерить время, пока результаты не будут на самом деле?

Пример псевдокода:

var getsomething = function(objs) {

    var results = objs.map(getsomethingforoneobj);

    $.when.apply(this,results).done(function() {
        var result;
        for (var i = 0; i < arguments.length; i++) {
            //do something with the data to augment the variable 'result'
        }
        console.log("load finished");
        console.log(result);
        return result;
    });
}

var getsomethingforoneobj = function(obj) {
    var url = "blabla"
    return $.ajax({
        async:true,
        url:url,
        success : function(data) {
            return data;
        }
    });
}

$(function() {
    var myobjs = [{},{},{},...]
    var a = getsomething(myobjs); //this is where I would want to temporize
    var b = a_function_of_a(a);
    //use b in the rest of the code
});

Одно из решений, очевидно, состоит в том, чтобы делать все синхронно, но я понял, что это очень плохая форма.

Вся помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я бы порекомендовал асинхронный водопад для вашего сценария.

Но если вы не хотите импортировать внешние библиотеки, вы можете проверить эту функцию Завершить , которая позволяет ставить в очередь хуки и выполнять функцию, когда все хуки были удалены из q.

В вашем случае это может быть что-то вроде:

...
$(function() {

    var a = null;
    var b = null;
    var myobjs = [{},{},{},...]

    var req_set = new Finalize(function() {
        console.log(a, b);
    });

    var hook1 = req_set.queue();
    getsomething(myobjs, function(err, res) {
        a = res
        hook1();
    }); //this is where I would want to temporize

    var hook2 = req_set.queue();
    a_function_of_a(a, function(err, res) {
        b = res;
        hook2();
    });

    req_set.exec();

});

Я также изменил ваши функции на Ошибка при первом вызове

0 голосов
/ 03 мая 2018

Вам нужно использовать какие-то обещания, чтобы решить эту проблему.

q.js

Это одна из библиотек, которая использует обещания и сохраняет состояние вызовов функций, пока они еще асинхронны. Они даже имеют разные вызовы, когда возвращается ошибка и возвращается успех

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...