问题的由来

在移动端开发的场景中,对于分页往往是不关心共有几页当前是第几页,有的是无限上拉加载,于是乎Query.count()不再是刚需,只有知道有没有后一页就可以。

目前的做法

// 计算总页数
getAllCourseCount: function () {
	var query = new AV.Query('Course');
	query.count().then(function (count) {
		const pageCount = Math.ceil(count / api.pageSize);
		that.page.pageCount = pageCount;
	});
}

// 监听到达底部作无限加载
onReachBottom: function () {
	if (that.page.pageNo >= that.page.pageCount) {
		wx.showToast({
			title: '没有更多内容了',
			icon: 'success'
		});
		return;
	}
	that.loadNewCourse(that.page.pageNo * api.pageSize);
	wx.showToast({
		title: '正在加载',
		icon: 'loading',
		duration: 2000
	})
}

// 请求最新课程
loadNewCourse: function (offset) {
	that.page.pageNo ++;
	api.loadNewCourse(offset, function (newCourse) {
		// 隐藏toast提示框
		wx.hideToast();
		// 保存数据
		that.setData({
			newCourse: that.data.newCourse.concat(newCourse)
		});
	});
},

// api.js获取最新上线课程
function loadNewCourse(offset, callback) {
    var query = new AV.Query('Course');
    query.equalTo('isShow', true);
    query.skip(offset);
    query.descending('createdAt');
    // 排序按照创建日期
    query.find().then(function (courseObjects) {
        callback(courseObjects);
    });
}

期望的方案

如果能在query.find().then(function(result){})中,result包裹一层{hasNext:true/false,data:[]}就能够免去调用count之后再去计算有没有后一页。

如以下代码,凭if (newCourse.hasNext)判断是否已经没有更多内容

// 请求最新课程
loadNewCourse: function (offset) {
	that.page.pageNo ++;
	api.loadNewCourse(offset, function (newCourse) {
		// 隐藏toast提示框
		wx.hideToast();
		if (newCourse.hasNext) {
			// 保存数据
			that.setData({
				newCourse: that.data.newCourse.concat(newCourse)
			});
		} else {
			wx.showToast({
				title: '没有更多内容了'
			});
		}
	});
},

谢谢

ps:发帖总说我Title 无效;试试写的更明确一些吧

事实上我们也不知道有没有下一页,一个简单的做法是,每次多查一个,比如 limit = 11,如果结果不到 11,那么就没有下一页了。

不错不错,这方法不错。

问题在于,请求时已经提供了equalTo,skip,limit了,应该是能知道有没有下一个了,就是后端默默地多查了一次翻页,只是说性能上有浪费。

if (!orderObjects[10]) {console.log('has no more...')}是个好办法,它的意思我理解。

我是说我已经告诉LeanCloud查询的条件了,后端应该还是能知道有没有更多数据的,就是一次默默查询就知道的。

不太可能,判断有没有下一页需要再做一次相同的查询,这基本上相当于请求数 x 2,您的费用会翻天的。

OK。是啊,正在看价格呢~就limit(11),挺管用