我正在尝试重构一些“同步”ajax 代码(使用 async:false 从 json 文件中获取一些配置属性并返回它们)。我删除了 async:false
,现在返回一个用值解析的 promise。
一些返回值是需要用作主干模型和集合的 URL 属性的 URL。所以函数(在 Config.js 中)之前是
getUrl: function () {
$.ajax({
url: 'config.json',
async: false,
dataType: 'json',
success: function (response) {
this.applicationUrl = response.applicationUrl;
}
});
return this.applicationUrl;
}
然后在集合或模型的 URL 属性中,它具有:
url: function () {
return Config.getUrl();
}
所以我试图解决这个问题的方法是让 getURL 函数返回一个 promise ,如下所示:
getUrl: function () {
var deferred = $.Deferred();
if (this.applicationUrl) {
deferred.resolve(this.applicationUrl);
} else {
$.ajax({
url: 'config.json',
dataType: 'json',
success: function (response) {
this.applicationUrl = response.applicationUrl;
deferred.resolve(this.applicationUrl);
}
});
}
return deferred.promise();
}
然后在模型/集合的初始化方法中,我调用:
initialize: function () {
Config.getUrl().done(function (url) {
this.baseUrl = url;
});
},
url: function () {
return this.baseUrl;
}
但是有什么方法可以确保在 url 需要用于获取之前解决 promise ?
最佳答案
可以看到here Backbone 不处理 url
的 promise 。
在这里,我将 promise 函数分配给模型的一个属性,并检查同步方法的状态以确保它首先被解析。
initialize: function () {
this._getUrl = Config.getUrl();
this._getUrl.done(function (url) {
this.url = url;
}.bind(this));
},
sync: function(method, model, options) {
options || (options = {});
if (this._getUrl.state() === 'pending') {
return this._getUrl.done(function (url) {
options.url = url;
return sync();
}.bind(this));
} else {
return sync();
}
function sync() {
return Backbone.sync.call(model, method, options);
}
}
关于javascript - 根据 promise 值分配主干 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998480/