javascript - 在 javascript 中使用 promises - 只访问服务器一次

标签 javascript jquery ajax

我试图完全理解 promise 的用法及其带来的好处。我有一个 AJAX 调用,可以从服务器获取大量数据。现在我没有实现 promise ,代码会在用户更改 View 时访问服务器(所有这些都使用相同的数据,只是它看起来的样子)。

这是我要添加的 promise :

function feedData(arr){
     //data being initialized
    this.initData();
}

feedData.prototype = {
    constructor: feedData,
    getData:function(){
        return $.ajax({
           url: 'php/getData.php',
           dataType: 'json',
           data: {
                //data being sent over
           }
        });
    },
    initData:function(){
        this.getData()
        .done(function(result){
            console.log(result.length);
        })
        .fail(function(x){
            console.log(x);
        });
    },
    ....
}

我可能没有完全理解这里的异步行为。我想要做的是从 getData 获取结果并填充一个充满数据的对象,每当用户更改 View 时都会调用该对象。从我读过的所有内容来看,这不是 promise 的用途。相反,我应该返回一个 promise 并再次使用该数据吗? (也许这是我的思路错误)

所以我的问题是,一旦从 AJAX 返回来自 getData 的数据,有没有办法返回 promise 并多次使用 .done 而无需点击服务器曾经?意思是,由于我将使用相同的数据并且无法将其保存到全局对象中,我该如何实现呢?

最佳答案

跟踪 $.ajax() 返回的 promise 。无论您调用 getData() 的频率如何,这只会调用一次(在构造函数中):

function FeedData() {
    this.data_promise = $.ajax({
        url: 'php/getData.php',
        dataType: 'json',
        data: {}
    });
}

FeedData.prototype = {
    constructor: FeedData,
    getData: function () {
        return this.data_promise;
    }
}

var feed = new FeedData();
feed.getData().then(function () {
    /* .. */
});

您也可以延迟获取,直到您第一次调用 getData():

function FeedData() {
    this.data_promise = null;
}

FeedData.prototype = {
    constructor: FeedData,
    getData: function () {
        if (this.data_promise === null) {
            this.data_promise = $.ajax({
                url: 'php/getData.php',
                dataType: 'json',
                data: {}
            });
        }
        return this.data_promise;
    }
}

关于javascript - 在 javascript 中使用 promises - 只访问服务器一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070670/

相关文章:

javascript - 在固定位置 div 上滚动

javascript - <h2> 当我点击菜单时未被查看

javascript - 使用 Google Apps 脚本获取网站的每个页面

javascript - 检查菜单链接是否有子菜单 JavaScript

javascript - CORS保护 : What is the point of HTTP_ORIGIN

javascript - AJAX 调用 PHP 函数并返回 JSON 时出错

javascript - Browserify + gulp 变得很慢

javascript - 使用 jquery 需要在 html 页面中显示 facebook 用户名

javascript - 检测有多少 div 超出窗口高度

javascript - jQuery AJAX 不断失败,不知道为什么