javascript - 在不使用 AJAX 的情况下继续之前等待方法响应

标签 javascript jquery ajax promise

我有一个应该返回特定值的方法,并且可以在一个页面加载中多次调用。需要返回的值只能通过 S/AJAX 访问,因此在第一次找到它后,它会存储在一个值中以供将来检索。

var dynamo = {
    stored_val : 0,
    get : function() {
        if(stored_val === 0) {
            $.ajax({
                url : 'URL'
                success : function(r) {
                    dynamo.stored_val = r;
                    // I want to return this value here now!
                }
            });
        } else {
            return dynamo.stored_val;
        }
    }
};

如您所见,我想使用 dynamo.get 并使其返回值易于访问,然后再继续其余代码。我了解 SJAX,但由于它已被弃用,我宁愿不使用它。我研究了 jQuery 的 promise ,它允许推迟方法直到操作完成,也许可以在这里使用?我已经研究过但找不到任何方法来做到这一点。如果它允许我做类似的事情:

dynamo.get().done(function(r) {
    // everything else here
    // r = the value of dynamo.stored_val after .get() and all AJAX calls within have completed
});

这可能吗?

我知道我可以简单地从 .get() 中提取方法并将其与回调一起使用,但我的代码中有多个点可能会调用 .get() > 随时(基于用户事件),我不想到处编写回调。

如果您需要更多信息,请告诉我!

最佳答案

将请求存储在某处,这样如果尚未完成,您可以返回待处理的请求,这样发出一个请求,并且结果会被缓存以供以后调用get ()

var dynamo = {
    xhr        : null,
    stored_val : 0,
    get        : function() {
        if( this.stored_val === 0 && this.xhr === null) {
            this.xhr = $.ajax({ url : 'URL', context : this }).always(function(res) {
                this.xhr = null;
                this.stored_val = res;
            })
        } else if (this.xhr === null) {
            this.xhr = (new $.Deferred()).resolve(this.stored_val);
        }
        return this.xhr;
    }
};

那么你可以这样做

dynamo.get().done(fn).fail(err);

关于javascript - 在不使用 AJAX 的情况下继续之前等待方法响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525388/

相关文章:

jquery - kendo ui treeview 存在 json 速度问题

jquery - 捕获 $.ajax 响应中的错误,并显示异常

javascript - 未捕获错误 : [$injector:modulerr] Failed to instantiate module showsApp due to: Error: [ng:areq] Argument 'fn' is not a function, 获取字符串

javascript - 从父元素取消绑定(bind)滚动事件并绑定(bind)到子元素

javascript - 更新同一页面内的 php 变量而无需重新加载页面

Jquery FullCalendar 更改日历上特定事件的可编辑属性

jquery - Div 大小取决于单击时从左到右翻译 Angular 的文本

javascript - 自定义验证 [AngularJS]

javascript - 我的网站使用 Twitter Bootstrap 并在 IE 10 上崩溃 - 动态图像

javascript - Jquery Ajax 和 php 逻辑