我在使用jQuery Deferred时遇到了一些麻烦。
我在函数包装器中使用了jQuery ajax调用,并且我试图按照范围的顺序依次链接两个成功的回调。但是,两个成功回调都是同时执行,这会导致问题。
我的初始函数调用看起来像这样(system.log是一个更智能的console.log。):
serverpaths.setConfig(path).then(system.log("BAM! SERVERPATHS: " + serverpaths));
在这个setConfig方法中,我有一个带有.then()的AJAX调用。 (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()调用而不需要它。我相信我可以解决这个问题,但是有一个伟大的开发者群体可以帮助他们反复思考。
我感谢您的所有建议。谢谢!
答案 0 :(得分:0)
做.then(function() { return promise })
什么都不做。您返回的承诺不会传播到下一个延期回调。
如果您想这样做,请使用.pipe()
代替.then()
。通过这种方式,您将能够实现承诺。
如果要链接3个异步调用,请执行以下操作:
firstDeferredCall.pipe(secondDeferredCall).pipe(thirdDeferredCall)
如果你写
firstDeferredCall.then(secondDeferredCall).then(thirdDeferredCall)
thirdDeferredCall
不会等待secondDeferredCall
来电执行。
修改:正如蒂姆所说,.pipe
是deprecated since jQuery 1.8。
如果您使用的是jQuery 1.8+,则可以使用现在替换.then
的{{1}}。 See documentation for .then。在这种情况下,您的代码应该没有任何修改。