Abortable promises并使用来自API的分页数据作为自动填充文本字段

时间:2016-11-03 22:54:53

标签: javascript jquery autocomplete promise ecmascript-6

免责声明:我是ES6的新手和一般承诺所以我的方法可能从根本上是错误的。

问题

我有一个返回分页数据的api。也就是说,它为集合返回一定数量的对象,如果有更多数据,它会在响应正文中返回Next属性,并使用url获取下一组数据。数据最终会在文本输入上提供自动完成功能。

具体而言,如果我的集合端点被称为/Tickets,则响应将如下所示:

{
   Next: "/Tickets?skip=100&take=100"
   Items: [ ... an array of the first 100 items ... ]
}

我目前获取所有票证数据的解决方案是

  1. 为返回整个合并数据集做出新承诺
  2. "环路" ajax通过链接done来调用,直到不再有Next
  3. 解决承诺
  4. 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对象,所以我不知道如何处理这个问题。

    所以我的主要两个问题是:

    1. 在返回promise时从api使用分页数据的适当方法是什么。
    2. 如何使退回的承诺可以中止?
    3. 附带问题:

      我觉得如果我没有发现错误,那么我的#34;包装"承诺将吞下任何抛出的错误。这是正确的假设吗?

      请注意,javascript代码可能有错误。它主要用于证明逻辑。

      修改:已解决

      我已经通过将这个答案https://stackoverflow.com/a/30235261/730326与评论中建议的xhrs数组合在一起来解决这个问题。当我找到时间时,我会用代码添加一个正确的答案。

0 个答案:

没有答案