我在使用 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() 调用,而我并不想要它。我确信我可以解决这个问题,但它有助于拥有一个伟大的开发者社区来反弹想法。
我感谢你的所有建议。谢谢!