免责声明:我是ES6的新手和一般承诺所以我的方法可能从根本上是错误的。
问题
我有一个返回分页数据的api。也就是说,它为集合返回一定数量的对象,如果有更多数据,它会在响应正文中返回Next
属性,并使用url获取下一组数据。数据最终会在文本输入上提供自动完成功能。
具体而言,如果我的集合端点被称为/Tickets
,则响应将如下所示:
{
Next: "/Tickets?skip=100&take=100"
Items: [ ... an array of the first 100 items ... ]
}
我目前获取所有票证数据的解决方案是
done
来调用,直到不再有Next
值getTickets(filterValue) {
let fullSetPromise = new Promise();
let fullSet = [];
// This gets called recursively
let append = function(previousResult) {
fullSet.concat(previousResult.Items);
// Loop!
if(previousResult.Next) {
$.ajax({
url: previousResult.Next
})
.done(append)
.catch(reason => fullSetPromise.reject(reason));
}
else {
fullSetPromise.resolve(fullSet);
}
}
// We set things off by making the request for the first 100
$.ajax({
url: `/Tickets?skip=0&take=100&filter=${filterValue}`
})
.done(append)
.catch(reason => fullSetPromise.reject(reason));
return fullSetPromise;
}
最终,前端使用承诺在文本输入上自动完成。理想情况下,当新输入进入时,我希望能够中止之前的呼叫。
inputChanged(e) {
this.oldTicketPromise.abort();
this.oldTicketPromise =
Api.GetTickets(e.target.value).then(updateListWithResults);
}
我知道去抖。但这只是意味着问题每n秒发生一次,而不是每次按键都会发生。
我知道jqxhr对象上有一个abort()属性,我希望调用者以某种方式可以使用它。但是因为GetTickets中使用了多个jqXHR对象,所以我不知道如何处理这个问题。
所以我的主要两个问题是:
附带问题:
我觉得如果我没有发现错误,那么我的#34;包装"承诺将吞下任何抛出的错误。这是正确的假设吗?
请注意,javascript代码可能有错误。它主要用于证明逻辑。
修改:已解决
我已经通过将这个答案https://stackoverflow.com/a/30235261/730326与评论中建议的xhrs数组合在一起来解决这个问题。当我找到时间时,我会用代码添加一个正确的答案。