淘汰多个ajax电话

时间:2017-10-10 19:49:53

标签: jquery ajax knockout.js knockout-3.0

以下代码执行多个ajax调用。我实际上只想要一个电话。

        var update = function(){

        if(self.origin() && self.destination()){

            // AJAX CALL HERE
            $.get(something);

        }
    }


    self.origin.subscribe(function() {
        update(false);
    });

    self.destination.subscribe(function() {
        update(false);
    });

    self.origindatetime.subscribe(function() {
        update(true);
    });

    self.returndatetime.subscribe(function() {
        update(true);
    });

我试过了deferred updates。但没有运气。

如何避免多次ajax调用?

1 个答案:

答案 0 :(得分:1)

不要单独订阅每个observable,而是考虑使用计算的observable,只在所有参数符合要求时进行ajax调用(参见示例:避免多个Ajax请求Tag property )。

以下是基于该示例:

function ViewModel() {
    this.origin = ko.observable();
    this.destination = ko.observable();
    ko.computed(function() {
        var params = { origin: this.origin(), destination: this.destination() };
            if (params.origin && params.destination) {
                $.get(something);
            }
    }, this).extend({ deferred: true });
}

计算出的observable将评估您的视图模型何时被实例化,然后每当原点或目标发生更改时。

延迟扩展程序仅确保如果您由于某种原因一次更新原点和目的地(例如在另一个函数中),则计算的observable只会被评估一次。