Javascript 延迟的JQuery数组,实现不起作用
有人能看到这个代码中有错误吗? 我在应用程序中使用这种方法,几乎完全相同,但出于某种原因,我似乎无法解决主要承诺“a”Javascript 延迟的JQuery数组,实现不起作用,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,有人能看到这个代码中有错误吗? 我在应用程序中使用这种方法,几乎完全相同,但出于某种原因,我似乎无法解决主要承诺“a” Parser.prototype.insertSomeData=函数(数据) { var a=$.Deferred(), table=“示例”, 列=[“col1”、“col2”、“col3”]; 风险值递延=[]; //将数据插入数据库 对于(变量i=0;i
Parser.prototype.insertSomeData=函数(数据)
{
var a=$.Deferred(),
table=“示例”,
列=[“col1”、“col2”、“col3”];
风险值递延=[];
//将数据插入数据库
对于(变量i=0;i
延迟数组中的两个承诺都得到了解决。因此,我认为问题出在
中,当任何人看到我缺少的东西时?延迟的只包含来自dfd
对象的承诺,因此它们是得到解决的承诺
您编写了dfd.resolve
,但这只不过是获取函数而已。您必须调用它:dfd.resolve()
当所有延迟完成时,您可能希望解析a
,而不是dfd
。$时。当
完成时,所有的dfd
都已解决,在这种情况下,您可能希望解决主延迟(a
)
@CrimsonChin:dfd
指向回调中的最后一项,这是由于JavaScript中的作用域是如何工作的。用(函数(i){…})(i)为循环体包装代码>。好的,看起来是这样!当我们在这里讨论作用域时,我不明白I与延迟有什么关系?@CrimsonChin:不仅I
的作用域是函数,而且dfd
。因此,在回调中,您每次都解析相同的延迟。通过将其包装在函数中,您可以创建单独的变量。哦,我明白了,dfd变量在每次失去作用域时都会被提升,因此它们都指向同一个dfd对象!我已经做了大约5个月的Javascript了,每次范围界定都会让我大吃一惊
Parser.prototype.insertSomeData = function(data)
{
var a = $.Deferred(),
table = "Example",
columns = ["col1", "col2", "col3"];
var deferreds = [];
// insert Data into the database
for (var i = 0; i < data.length; i++)
{
var dfd = $.Deferred();
deferreds.push(dfd.promise());
item = data[i];
database.insert(table, columns, [item.one, item.two, item.three], function(){console.log("resolved"); dfd.resolve()}, dfd.reject);
}
$.when.apply(null, deferreds).then(function(){console.log("it worked!"); a.resolve()});
return a.promise();
}