javascript - 使用 $.when 时如何解决竞争条件

标签 javascript jquery promise

我正在尝试使用 jQuery $.when() 在初始化客户端控件之前加载一堆本地化资源:

var fooControl = (function($, kendo, _) {

    var
        initResources = function() {
            return $.when(
                window.clientResources.getAll("Messages").done(function(d) {
                    resources["Messages"] = d;
                }),
                window.clientResources.getAll("Cost").done(function(d) {
                    resources["Cost"] = d;
                })
            );
        },

        init = function(options) {
            /*... */
        }
}


//calling:
$(function() {
    fooControl.initResources().then(fooControl.init(options));
});

我想要实现的是,initResources 等待资源加载并分配给它们的变量。如果数据已缓存,它们可以从 API 端点或 localStorage 加载。 实际发生的情况是,我收到错误无法读取未定义的属性“CostType”,这表明成本资源尚未完全加载。

因此,我怀疑对 window.clientResources.getAll() 的调用已正确解析,但未正确解析以下 .done 方法,这会导致竞争条件,资源正在丢失。

如何确保整个调用堆栈(包括 resources 变量的分配)已得到解析,然后才会调用以下 init 函数?

最佳答案

您立即调用 init 并将其返回值作为成功回调处理程序传递,一个简单的解决方案是使用匿名方法

fooControl.initResources().then(function(){
    fooControl.init(options);
});

关于javascript - 使用 $.when 时如何解决竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45006009/

相关文章:

javascript - Windows 通用应用程序 - Javascript - 文件 IO - 无响应

javascript - 在 JavaScript 中,为什么 "reverse while"循环比 "for"快一个数量级?

javascript - 如何使固定的背景图像不固定在滚动条上?

javascript - 日历插件示例无法在 .net 上运行

javascript - 将 javascript 文件恢复为 html 中的按钮

javascript - 我被困在 promise 构造函数中的执行器函数上

javascript - 为什么 Promise 中的代码会同步执行?

javascript - 有没有办法最终添加到现有的 promise 中?

javascript - 如何使链式 firebase 查询异步

javascript - Adobe 字符串到 Javascript 对象