javascript - ajax请求一个异步代码的问题

查看:127
本文介绍了javascript - ajax请求一个异步代码的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

问题

现在有一个需求,我需要发送n个请求,接口如下
favorite/goods?update_time={time}&page={page}&size={size}
GET到的数据格式为{update_time: Number, data: []}
每个请求是依赖上一个请求的,比如这个请求的update_time要放在下一个请求中,每个请求的page也会++,

需求

我需要一次性拿到n组数据,一次性展示到页面上

限制

公司目前只支持到promise,还不能用yeild和async

提问

请问大家应该怎么做,因为n的个数不一定,我不能手动一直.then去写

解决方案

没人答自己写了一个。。。代码如下


    //  下拉刷新请求
    request(callback) {
        //  区分首次加载和之后加载,首屏加载会有加载组件,回退定位等
        if (this.isFirstLoaded) {
            //  从localStorage中获取上次加载页数
            let initPage = localStorage.getItem(LS_KEY.goodsPage)
                ? parseInt(localStorage.getItem(LS_KEY.goodsPage), 10)
                : 1;
            localStorage.removeItem(LS_KEY.goodsPage);
            //  扩大初始加载个数
            this.baseNum = initPage * LOAD_SIZE;
            Spinner.show();
            this.initRequest([], initPage, callback);
        }
        else {
            this.loadGoodsData(callback);
        }
        return;
    }

    //  加载首屏数据,用于回退定位
    loadInitData() {
        this.goodsPage++;
        this.goodsInfo.goodsModel.params = {
            favorite_update_time: this.goodsInfo.updateTime,
            page: this.goodsPage,
            size: LOAD_SIZE
        };
        return this.goodsInfo.goodsModel.get();
    }

    //  一个递归请求,可加载多页数据,用于带回退定位的首次加载数据
    initRequest(target = [], stopPage = 1, callback) {
        this.loadInitData()
            .then(data => {
                target = target.concat(data.goodsList);
                this.handleResponse(data);
                if (stopPage === 0) {
                    callback && callback(target);
                    this.isFirstLoaded = false;
                    Spinner.hide();
                    return;
                }
                stopPage--;
                this.initRequest(target, stopPage, callback);
            });
    }

    //  对每次的数据请求进行处理
    handleResponse(data) {
        let goods = this.itemsStore;
        let newLoadList = data.goodsList;
        if (newLoadList.length === 0) {
            this.isFirstLoaded && this.props.showNoGoods();
            this.goodsPage--;
        }
        this.goodsInfo.updateTime = data.updateTime;
        this.updateLocalStorage({
            goodsList: goods.concat(newLoadList),
            updateTime: data.updateTime
        });
    }

这篇关于javascript - ajax请求一个异步代码的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆