【问题标题】:Load data using Callback. Is there a better solution using ES6 Promises?使用回调加载数据。使用 ES6 Promises 有更好的解决方案吗?
【发布时间】:2016-07-04 12:34:25
【问题描述】:

我有一个在项目的多个地方调用的方法。我已经做了方法。第一个方法调用做 Ajax 获取,在类属性中缓存数据并触发回调。第二个调用方法只调用带有缓存数据的回调。我想添加同步加载数据的功能。该方法应返回日期。我添加了一个额外的参数来调用 {async: false},但我想知道使用 ES7 Promise 是否有更好的解决方案?

这是我的回调解决方案。

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
});

【问题讨论】:

  • 如果函数是异步的,你不能让它同步。 Promise 不是一种使异步函数成为同步函数的方法。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但是 es7 async/await 没有这样的返回值:let a = loadDataTest.getData({ async: false })
  • @Whitcik:let a = await loadDataTest.getData()async function 中。
  • @Whitcik:你为什么认为你需要使函数同步?
  • 是的,它会工作,但它只会在异步功能中等待,我需要在所有应用程序中等待数据。也许将来我需要同步加载数据。
  • 不,你不需要。您不希望整个应用程序挂起。你想让你的整个应用异步。
猜你喜欢
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多