等待方法的响应,然后继续而不使用SJAX

时间:2016-02-20 15:42:41

标签: 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的承诺,允许方法延迟到动作完成,也许可以在这里使用?我已经调查了它,但无法找到任何办法。如果它允许我做类似的事情:

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()(基于用户活动)和我不想在任何地方写回调。

如果您需要更多信息,请与我们联系!

2 个答案:

答案 0 :(得分:0)

将请求存储在某处,这样您就可以在尚未完成的情况下返回待处理的请求,这样就可以一个请求,并且结果会被缓存以便以后调用{{1} }

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;
    }
};

答案 1 :(得分:0)

存储"承诺"在stored_val中 - 然后.get将始终返回相同的内容," Promise",并且像任何其他Promise一样使用它... .then(不确定.done是什么在jquery中,即对底层Promise有任何副作用吗?如果没有,那么使用.done而不是.then

var dynamo = {
    stored_val : 0,
    get : function() {
        if(dynamo.stored_val === 0) {
            dynamo.stored_val = $.ajax({
                url : 'URL'
            });
        }
        return dynamo.stored_val;
    }
};

dynamo.get().then(function(result) {
    // do something with result
});

就个人而言,我发现这样的对象有点麻烦,特别是当它们对它们有更多的时候 - 我更喜欢使用IIFE来代替这些代码

var dynamo = (function() {
    var stored_val;
    return {
        get : function() {
            return stored_val = (stored_val === undefined) ? $.ajax({ url : 'URL' }) : stored_val;
        }
    };
}());

甚至更清洁

var dynamo = (function() {
    var stored_val;
    return function() {
        return stored_val = (stored_val === undefined) ? $.ajax({ url : 'URL' }) : stored_val;
    };
}());

但是,在最后一种情况下,用法是

dynamo().then(...);

不需要get(),dynamo现在是一个函数