0

我在使用 jQuery Deferred 时遇到了一些麻烦。

我在函数包装器中使用 jQuery ajax 调用,并且尝试按照范围顺序依次链接两个成功回调。但是,两个成功回调同时执行,这会导致问题。

我的初始函数调用如下所示(system.log 是更智能的 console.log。):

serverpaths.setConfig(path).then(system.log("BAM! SERVERPATHS: " + serverpaths));

在这个 setConfig 方法中,我有一个 AJAX 调用,其中链接了一个 .then() 。(system.defer 是一个包装器,它返回一个 jQuery.Deferred 对象;http.get 是一个 jQuery.ajax 的包装器。)

config.setConfig = function (configObj) {
    var that = this;
    var inlineHelper = function (data) {
        return system.defer(function (dfd) {
            for (var key in data) {
                system.log("Config[" + key + "]: " + that[key]);
                system.log("Data[" + key + "]: " + data[key]);
                that[key] = data[key];
                system.log("New Config[" + key + "]: " + that[key]);
            }
        }).promise();
    };

    if (typeof configObj === "string") {
        http.get("api/getPathConfig")             // The problem seems to be in this area
            .then(function (data) {
                return system.defer(function () {
                    inlineHelper(data);
                }).promise();
            });
    } else {
        return system.defer(function () {
            inlineHelper(configObj);
        }).promise();
    }
};

理想情况下,应该调用 ajax 请求,然后调用 inlinehelper,然后调用 system.log,因为我正在使用 return 语句将我的 promise 对象踢回链。这里的问题是调用ajax请求,然后同时调用system.log和inlinehelper。

有没有人遇到过这样的问题?函数作用域和异步调用似乎在这里互相争斗。我确定我可以解决这个问题,但这似乎不太合乎逻辑 - 我的猜测是,当我的 ajax 请求触发成功时,它会在我的主范围内触发 .then() 调用,而我并不想要它。我确信我可以解决这个问题,但它有助于拥有一个伟大的开发者社区来反弹想法。

我感谢你的所有建议。谢谢!

4

1 回答 1

0

只做.then(function() { return promise })无济于事。您返回的承诺不会传播到下一个延迟回调。

如果您想这样做,请使用.pipe()而不是.then(). 这样,您将能够链接承诺。

如果要链接 3 个异步调用,请执行以下操作:

firstDeferredCall.pipe(secondDeferredCall).pipe(thirdDeferredCall)

如果你写

firstDeferredCall.then(secondDeferredCall).then(thirdDeferredCall)

thirdDeferredCall不会等待secondDeferredCall调用被执行。

编辑:正如 tim 所说,自 jQuery 1.8 以来.pipe已弃用。

如果您使用的是 jQuery 1.8+,则可以使用.thenwhich now 替换.pipe. 请参阅 .then 的文档。在这种情况下,您的代码应该是好的,无需任何修改。

于 2012-06-14T11:52:59.930 回答