无极重试包装为灰烬

问题描述 投票:0回答:1

我的灰烬代码片段调用API结束点,并且当响应到达填充的阵列(有添加到阵列独立的API调用我为了简化省略不相关的代码的其他项目。):

descriptor: Ember.computed("qParams", function(){
    let qParams = this.get("qParams");
    let data = new Ember.A();
    let callHomePromise = this.get("store").find('info-extractor', qParams)
    .then(item => { data.pushObject(item); });
    return data;
    })

此代码工作正常,并完成它打算这样做。我想创建一个retrier:万一this.get("store").find由于底层AJAX调用与401响应,例如失败了,我想给它一对夫妇更尝试。在此基础上回答

https://stackoverflow.com/a/51332115/1518685

我设计了以下包装:

export default function (promiseFactory) {

  let retryChain = Ember.RSVP.reject();
  for (var count = 0; count < 3; count++) {
  retryChain = retryChain.catch(reason => {
      return new Ember.RSVP.Promise((resolver, rejector) => {
        promiseFactory().catch(r => {
        setTimeout(rejector.bind(null, reason), 1000);
      }).then(ok => { resolver(ok); })
      });
    });
  }

  return retryChain;
}

其中我执行方式如下:

import retrier from 'project/utils/retrier';

//....

descriptor: Ember.computed("qParams", function(){
    let qParams = this.get("qParams");
    let data = new Ember.A();
    let callHomePromise = retrier(() => { 
         return this.get("store").find('info-extractor', qParams); 
        }).then(item => { data.pushObject(item); })
          .catch(reason => { /* do stuff with reason */});
    return data;
    })

我模拟坏请求(通过设置故障qParams变量)和观察多个AJAX请求失败,最终永久性故障获取retrier后赶上()方法中抓获。

然而,当调用成功,则retrier承诺从未解析和我找不出我们为什么呢?

任何帮助将高度赞赏。

ember.js promise ember-2.0.0
1个回答
1
投票

在这部分代码

    return new Ember.RSVP.Promise((resolver, rejector) => {
      promiseFactory().catch(r => {
      setTimeout(rejector.bind(null, reason), 1000);
    })

永远不会调用解析器所以它不可能成功,并达到以下then。移动然后将下面的成像这样的表达式:

  retryChain = retryChain.catch(reason => {
    return new Ember.RSVP.Promise((resolver, rejector) => {
      promiseFactory().then(ok => { resolver(ok); }, r => {
        setTimeout(rejector.bind(null, reason), 1000);
      });
    });
  });
© www.soinside.com 2019 - 2024. All rights reserved.