javascript - 构建 Promise 对象的有效方法

标签 javascript ecmascript-6 promise

目前我所拥有的是:

    getData(user) {
     return this.$q.all({
        userInfo: this.$http.get(this.buildUrl('user.getinfo', user)),
        userTopArtists: this.$http.get(this.buildUrl('user.gettopartists', user)),
        userChart: this.$http.get(this.buildUrl('user.getWeeklyChartList', user))
            .then(resp => {
                let promises = [];
                let data = resp.data.weeklychartlist.chart;
                for (let i = data.length - 4; i < data.length; i++) {
                    promises.push(
                        this.$http.get(this.buildUrl('user.getWeeklyTrackChart', user) + `&from=${data[i].from}&to=${data[i].to}`)
                        .then(resp => {
                            return resp.data.weeklytrackchart.track.length;
                        })
                    );
                }

                return this.$q.all(promises);
            })
    }).then(resp => {
        return resp;
    }).catch(err => {
        this.$q.reject('Error' + err.status);
    })
}

但我认为可能有一种更实用的方法来构建这个 Promise 对象,因为很多代码都在重复。所以我尝试想出一个更好的解决方案:

    buildPromiseObj(target) {
     const methods = ['getinfo', 'gettopartists', 'getweeklychartlist'];
     let obj = {};
     for ( let method in methods ) {
        obj[`${methods[method]}`] = this.$http.get(this.buildUrl(`${target}.${methods[method]}`, target))
    }
}
  1. 这种方法有意义吗?我应该使用它吗?
  2. 您可以看到我在第一个函数中发出的第三个请求还有其他嵌套请求。有什么方法可以将其集成到我上面编写的方法中吗?

最佳答案

是的,像这样概括总是一个好主意。但是:

关于图表列表,您只需在调用 all 之前将另一个 then 附加到 Promise 中即可。您还可以通过使用更实用的方法来极大地简化回调:

getData(user) {
    const methods = ['Info', 'TopArtists', 'WeeklyChartList'];
    let promises = {};
    for (let method of methods) {
        obj['user' + method] = this.$http.get(this.buildUrl('user.get'+method.toLowerCase(), target));
    }
    promises.userWeeklyChartList = promises.userWeeklyChartList.then(resp =>
         this.$q.all(resp.data.weeklychartlist.chart.slice(-4).map(val =>
             this.$http.get(this.buildUrl('user.getWeeklyTrackChart', user) + `&from=${val.from}&to=${val.to}`)
         ).then(resp =>
             resp.data.weeklytrackchart.track.length
         ))
    );
    return this.$q.all(promises).catch(err => {
        throw new Error(err.status);
    });
}

关于javascript - 构建 Promise 对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309202/

相关文章:

javascript - 将 promise 与失败串联起来

javascript - 应该如何在 React 类中编写函数?

javascript - 无法获取元数据选择器文本

javascript - vuex 突变取代了整个状态

javascript - 更改 &lt;input&gt; 字段的显示

reactjs - Redux 更新嵌套数据 [不可变更新模式]

javascript - 在 React Redux 中改变状态的正确位置

scala - 什么时候不能用 Future 代替 Promise?

javascript - 为什么将Nightmarejs与async/await一起使用时,我的 promise 为何无法解决?

javascript - 将 jqGrid 行按钮绑定(bind)到 Knockout JS 时超出了最大调用堆栈大小