AJAX成功后不会设置匿名函数导致id

时间:2013-07-15 23:51:26

标签: javascript ajax anonymous-function

我正在匿名函数中进行AJAX调用。当成功回调发生时,我就可以设置我的自定义JS对象ID以及从数据服务器到达的其他重要信息。

在我将a.target.id设置为返回的data.id之后,一切看起来都很好。

在我调用函数以使用新更新的自定义JS对象执行某些操作的步骤中,我刚刚使用来自服务器的响应数据进行了更新。我正在将该对象的父对象传递给该方法,以便对该对象的所有子对象进行一些处理。

但是,正如您在快照照片中的最后一个示例中所看到的,a.target.parent.children [0] .id不在集合中和/或它从未设置的ID中。

在使用匿名函数时,我必须在AJAX调用期间丢失对该对象的引用。

以下是所有代码。我怎么会失去参考?或者,当AJAX调用返回时,如何保持对父项子项的引用?

我之前从未发生过这种情况,让我相信它与匿名功能有关。

var horizontalPositioner = function (horizontals) {

    var hpa = ['?horPositions='];

    for (var i = 0; i < horizontals.children.length; i += 1) {

        hpa.push(horizontals.children[i].id + ':' + horizontals.children[i].position + ',');
    };

    hpa[i] = hpa[i].replace(',', '');

    dataBase.update(dbPart('horizontal' + hpa.join('')));
};


this.subscribe.call(this, e.horizontaladded, function (a, fn) {
    //
    if (!a.extra.owner.id) {
        return;
    };

    (function (a) {

        dataBase.insert(
            dbPart(
            ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''),
            a.target
            ),
            dbCB(
            function (data, status) {
                if (status === 'error') { return; };

                a.target.id = data.id,
                a.target.HTML().addClass('alum_' + data.id),
                a.target.finish.id = data.finishID,
                a.target.size.id = data.sizeID,
                a.target.siteLine.id = data.sitelineID;
                //
                //reposition horizontals
               // setTimeout(function () { horizontalPositioner(a.target.parent); }, 1000);
                debugger
                horizontalPositioner(a.target.parent);

                if (fn) { processCallbacks(data, status, fn); };


                //very last
                events.publishDatabaseCallbacks(e.horizontaladded,
                    eArgs(a.bay, { data: data, instanceName: 'horizontal', ownerid: a.extra.owner.id, id: data.id }));

            },
            function (xhr, status, errorThrown) { console.log('ERROR adding horizontal'); })
        );

    }(a));

}, true);

Snap shot of the three steps

1 个答案:

答案 0 :(得分:0)

我添加了一个带有嵌套setTimeout的匿名函数,以便为构建提供所有时间。我有很多事件同时发生,所以现在这很有效。

var horizontalPositioner = function (horizontals) {

    (function (hors) {

        setTimeout(function () {

            var hpa = ['?horPositions='];

            for (var i = 0; i < hors.children.length; i += 1) {
                hpa.push(hors.children[i].id + ':' + (hors.children[i].position ? hors.children[i].position : 1) + ',');
            };

            hpa[i] = hpa[i].replace(',', '');

            dataBase.update(dbPart('horizontal' + hpa.join('')));

        }, 1000);

    }(horizontals));
};