Javascript 使用回调加载数据。使用ES6承诺是否有更好的解决方案?

Javascript 使用回调加载数据。使用ES6承诺是否有更好的解决方案?,javascript,ajax,ecmascript-6,es6-promise,ecmascript-2016,Javascript,Ajax,Ecmascript 6,Es6 Promise,Ecmascript 2016,我有一个方法,它在项目中的几个地方被调用。我已经用这个方法做了。第一个方法调用doajaxget、在类属性中缓存数据和fire回调。第二个调用方法仅使用缓存数据调用回调。我想添加同步加载数据的功能。方法应返回日期。我添加了一个额外的参数来调用{async:false},但我想知道是否有更好的解决方案使用ES7承诺 这是我的回调解决方案 export class loadData { constructor() { this.data = []; } get

我有一个方法,它在项目中的几个地方被调用。我已经用这个方法做了。第一个方法调用doajaxget、在类属性中缓存数据和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
});

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

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
/
wait

如果该函数是异步的,则无法使其同步。承诺不是使异步函数成为同步函数的一种方法。谢谢,但是es7 async/Wait没有像这样的返回值:let a=loadDataTest.getData({async:false})@Whitcik:这是
let a=await loadDataTest.getData()
异步函数中
@Whitcik:为什么你认为需要使函数同步?是的,这将是工作,但它将是等待只有在异步函数,我需要等待在所有的应用程序的数据。也许将来我需要同步加载数据。不,你不需要。你不希望你的整个应用程序挂起。您希望使整个应用程序异步。