Javascript 延迟的JQuery数组,实现不起作用

Javascript 延迟的JQuery数组,实现不起作用,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,有人能看到这个代码中有错误吗? 我在应用程序中使用这种方法,几乎完全相同,但出于某种原因,我似乎无法解决主要承诺“a” Parser.prototype.insertSomeData=函数(数据) { var a=$.Deferred(), table=“示例”, 列=[“col1”、“col2”、“col3”]; 风险值递延=[]; //将数据插入数据库 对于(变量i=0;i

有人能看到这个代码中有错误吗? 我在应用程序中使用这种方法,几乎完全相同,但出于某种原因,我似乎无法解决主要承诺“a”

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();
        }