javascript - 根据 promise 值分配主干 URL

标签 javascript backbone.js promise

我正在尝试重构一些“同步”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/

相关文章:

javascript - 如何使用 jQuery 查找特定文本并设置它们的样式

javascript - 如何计算元素相对于屏幕的位置

javascript - 如何知道异步 for 循环何时完成?

javascript - 异步函数总是返回 undefined

javascript - 立即调用的简单 JavaScript 函数不起作用……为什么?

javascript - 为什么我不能通过 Javascript 在嵌套 div 中插入 html?

javascript - Backbone.js 自定义集合排序

javascript - Backbone.js 未捕获类型错误 this.model.each 不是函数

javascript - 在 Node.js 7 中,抑制 UnhandledPromiseRejectionWarning 的正确方法是什么?

javascript - 如何将事件监听器附加到打开的颜色框?