JQuery等待多个延迟解决

时间:2014-02-12 18:28:12

标签: javascript jquery sqlite asynchronous deferred

我有以下函数查询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 ...非常感谢任何建议

1 个答案:

答案 0 :(得分:2)

您的代码对我来说似乎不必要了。

由于$.when也会创建承诺,所以不要自己创建masterDeferred,只需执行以下操作:

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

唯一的功能差异在于此版本会将true结果作为单个参数传递给最终回调,而您的代码将传递[true, true, ...]个值的单个数组。