js中生成器用户示例 发表于 2019-12-18 记录下js中生成器的妙用 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485function pagination(api, param) { async function* paginationIterator() { const defaultPrams = { pageSize: 20, pageNo: 1 }; const thePaginationData = []; const sentPrams = { ...defaultPrams, ...param }; do { const { total, data } = await api(sentPrams); sentPrams.pageNo += 1; sentPrams.total = total; thePaginationData.push(...data); yield thePaginationData; } while ((sentPrams.pageNo - 1) * sentPrams.pageSize < sentPrams.total); } const iterator = paginationIterator(); const fetchPagination = async () => { const { done, value } = await iterator.next(); if (done) return null; return value; }; return fetchPagination;}const fetchApi = params => { return new Promise(resolve => { setTimeout(() => { if (params.pageNo < 3) { resolve({ data: [1 * params.pageNo, 2, 3, 4, 5], total: 13 }); } else { resolve({ data: [111, 112, 113], total: 13 }); } }, 2000); });};const fetchMoreGoods = pagination(fetchApi, {pageSize: 5});let isFetching = false;const getData = async () => { if (isFetching) return; isFetching = true; try { const data = await fetchMoreGoods(); console.log(data); } catch (error) { } finally { isFetching = false; }};// 不能这样测试哦,由于js是单线程,这里会一直占用执行线程,因而就没空去运行 setTimeout(() => {}) 等微、宏任务了。// while(true) {// getData();// }// 测试下getData();setTimeout(() => { getData() setTimeout(() => { getData() setTimeout(() => { getData() }, 3000); }, 3000);}, 3000);/**[ 1, 2, 3, 4, 5 ][ 1, 2, 3, 4, 5, 2, 2, 3, 4, 5 ][ 1, 2, 3, 4, 5, 2, 2, 3, 4, 5, 111, 112, 113 ]null */