我有一个在项目中的几个地方调用的方法。我做过方法。第一个方法调用做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
});
答案 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
。