用Promise分页的最好方法是什么?

我和我的朋友正在承诺,我们正在确保在返回到最初的通话之前,我们正在获取所有的数据页面。 有没有更简单的方法来解决这个问题?

function getDocuments(startIndex, result, entries) { startIndex = typeof startIndex !== 'undefined' ? startIndex : 0; result = typeof result !== 'undefined' ? result : {}; entries = typeof entries !== 'undefined' ? entries : []; // build our entries set with the result parameter for(var i in result.items) { try { var id = result.items[i].id; var name = result.items[i].name; var content = result.items[i].content; var entry = { "id": id, "name": name, "content": content }; entries.push(entry); } catch(e) { } } // return a promise that fulfills a promise that then returns either a promise or a result. return new Promise(function(fulfill, reject) { // fulfill the promise and resolve the value, we pass a recursive promise as the value. fulfill(documentClient.getDocuments({ "startIndex": startIndex }).then(function(result) { // once our request is made, let's check the page count. var startIndex = result.startIndex; var pageSize = result.pageSize; var totalCount = result.totalCount; if (startIndex + pageSize <= totalCount) { // if our current position is not at the end of the pages, return a promise with our current data and our current entries. return getDocuments(startIndex + pageSize, result, entries); } return entries; // otherwise our entries will bubble back up the stack and be resolved into the initial fulfill value. })); }); } getDocuments().then(function(d) { console.log(d.length); }); 

我的调整:

 function getDocuments(startIndex, result, entries) { startIndex = typeof startIndex !== 'undefined' ? startIndex : 0; result = typeof result !== 'undefined' ? result : {}; entries = typeof entries !== 'undefined' ? entries : []; // build our entries set with the result parameter // ... // return a promise that fulfills a promise that then returns either a promise or a result. return documentClient.getDocuments({ "startIndex": startIndex }).then(function(result) { // once our request is made, let's check the page count. var startIndex = result.startIndex; var pageSize = result.pageSize; var totalCount = result.totalCount; if (startIndex + pageSize <= totalCount) { // if our current position is not at the end of the pages, return a promise with our current data and our current entries. return getDocuments(startIndex + pageSize, result, entries); } return entries; // otherwise our entries will bubble back up the stack and be resolved into the initial fulfill value. }); } getDocuments().then(function(d) { console.log(d.length); }); 

是的,你可以像这样链接promise, documentClient.getDocuments返回一个promise。

 function getDocuments(startIndex, result, entries) { // ... return documentClient.getDocuments({ "startIndex": startIndex }).then(function(result) { // ... return entries; // otherwise our entries will bubble back up the stack and be resolved into the initial fulfill value. }); } getDocuments().then(function(d) { console.log(d.length); }); 

getDocuments的代码path不会以新的承诺结束

这是一个简单的例子

 function defer(fn) { setTimeout(fn, 100); } function promiseChain(i, msg) { if (i <= 0) return msg; // end code path return new Promise((res, rej) => { defer(e => res(promiseChain(i - 1, msg))); }); } promiseChain(10, "Hello World!").then(data => console.log(data)); // "Hello World!" logged after ten 100ms timeouts