JQuery Ожидание разрешения нескольких отложенных запросов

У меня есть следующая функция, которая запрашивает базу данных SQLite и помещает результаты в массив, который используется позже. Мне нужно дождаться, пока каждый оператор обработает таблицы в (self.projectSetEditList). Однако кажется, что отложенный мастер не ждет всех обещаний ... Я просто делаю все это неправильно? Мне нужно знать, когда все результаты sql будут готовы, прежде чем переходить к следующей функции.

/// <summary>Validates user INSERTS to project_set entities</summary>
this.initProjectSetAdds = function ()
{
    var promises = [];
    var masterDeferred = new $.Deferred();

    ///var count = (self.projectSetEditList.length - 1);
    $.each(self.projectSetEditList, function (index, syncEntity)
    {
        var def = new $.Deferred();
        //get the config entity definition object
        var entityDefinition = self.getEntityDefinition(syncEntity.entity_name);
        self.db.executeSql(self.getAddsSql(entityDefinition)).done(function (tx, insertResults)
        {
            self.projectSetAdds.push({ definition: entityDefinition, addedObjects: dataUtils.convertToObjectArray(insertResults) });
            def.resolve(true);
        });
        promises.push(def);
    });

    //resolve all deferred and return to caller
    $.when.apply($, promises).then(function ()
    {
        masterDeferred.resolve(arguments);
    },
    function ()
    {
        masterDeferred.reject(arguments);
    });

    return (masterDeferred.promise());
}

Единственная асинхронная функция внутри - executeSql... Любые предложения приветствуются


person gdex    schedule 12.02.2014    source источник
comment
См. также api.jquery.com/ajaxStop.   -  person Blazemonger    schedule 12.02.2014
comment
@Blazemonger, executeSql - это не вызов ajax, это асинхронный вызов плагина SQLite...   -  person gdex    schedule 12.02.2014


Ответы (1)


Ваш код кажется мне излишне сложным.

Поскольку $.when также создает обещание, не утруждайте себя созданием masterDeferred самостоятельно, просто выполните:

return $.when.apply($, promises);

Единственная функциональная разница заключается в том, что эта версия будет передавать результаты true в качестве отдельных параметров возможному обратному вызову, тогда как ваш код будет передавать один массив значений [true, true, ...].

person Alnitak    schedule 12.02.2014
comment
Извините за дополнительный код, который не был необходим для иллюстрации проблемы. Пока ваше решение работает... Спасибо! - person gdex; 12.02.2014