2

我正在从匿名函数中进行 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);

三个步骤的快照

4

1 回答 1

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));
};
于 2013-07-16T02:47:18.250 回答