2014-02-12 117 views
2

我有以下函数查询SQLite数据库并将结果推送到稍后使用的数组中。我需要等待每条语句处理(self.projectSetEditList)中的表。然而,似乎延迟的主并没有等待所有的承诺......我只是想说这全错了吗?在进入下一个函数之前,我需要知道所有sql结果何时准备就绪。JQuery等待多个延迟来解决

/// <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 ...任何建议都非常赞赏

+0

另请参见https://api.jquery.com/ajaxStop/ – Blazemonger

+0

@Blazemonger,executeSql不是ajax调用,它是SQLite插件异步调用... – gdex

回答

2

你的代码出现不必要的复杂我。

由于$.when也创造了一个承诺,不打扰你自己创建masterDeferred,只是做:

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

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

+0

对不起,不需要额外的代码来说明问题。到目前为止,您的解决方案似乎正在工作......谢谢! – gdex