使用Callback加载数据。使用ES6 Promises有更好的解决方案吗?

时间:2016-07-04 12:34:26

标签: javascript ajax ecmascript-6 es6-promise ecmascript-7

我有一个在项目中的几个地方调用的方法。我做过方法。第一个方法调用做Ajax get,缓存类属性和fire回调中的数据。第二个调用方法仅使用缓存数据调用回调。我想添加同步加载数据的功能。该方法应返回日期。我添加了一个额外的参数来调用{async:false},但我想知道是否有更好的解决方案使用ES7承诺?

这是我的回调解决方案。

export class loadData {
    constructor() {
        this.data = [];
    }
    getData({callback, async = true}){
        let syncData = this.data;
        if( this.data.length === 0 ){
            $.ajax({
                beforeSend: authorizationManager.addAuthorizeHeader(),
                url: apiUrl + '/Data/datadata',
                dataType: 'json',
                cache: true,
                async: async
            }).done((data)=>{
                if(async) callback(data);
                this.data = data;
                syncData = data;
            });
        } else {
            if(async) callback(this.data);
        }

        if(async === false) return syncData;
    }

}
loadDataTest = new loadData();

调用异步

loadDataTest.getData({
    callback: (data) =>{
        console.log(data);
    }
});

呼叫同步

let a = loadDataTest.getData({
    async: false
});

1 个答案:

答案 0 :(得分:2)

承诺几乎总是更好的解决方案。当然,它们永远不会同步,但这通常也是更好的解决方案。这就是它的样子:

export class loadData {
    constructor() {
        this.promise = null;
    }
    getData() {
        if (this.promise == null) {
            this.promise = Promise.resolve($.ajax({
                beforeSend: authorizationManager.addAuthorizeHeader(),
                url: apiUrl + '/Data/datadata',
                dataType: 'json',
                cache: true
            }));
        }
        return this.promise;
    }
}

电话:

loadDataTest.getData().then((data) => {
    console.log(data);
});
  

我想添加同步加载数据的功能

我不认为你真的想要那个。如果您想要的是异步功能的同步语法,请查看async / await