Почему решение об обещании не вызывает .then и как я могу отследить проблему дальше? - PullRequest
0 голосов
/ 23 апреля 2020

Итак, у меня есть метод управления API, который обрабатывает пакеты запросов / ограничения скорости, и мой код просто перестал выполняться без вывода сообщений. Программа закрывается (я знаю, что она не просто не может выполнить итерацию, потому что есть постоянная setInterval fun c работает) без каких-либо ошибок.

Поэтому я начал отслеживать выполнение с помощью "debug 1", "debug 2 "консольные журналы и добрались до этого выхода:

...repetition of this pattern
debug 8.3 52 62
debug 2 https://api.tradier.com/v1/markets/options/expirations?symbol=ORLY&includeAllRoots=true
debug 2.5 {"expirations":{"date":["2020-05-15","2020-06-19","2020-08-21","2020-11-20"]}}
debug 4
debug 5.1
debug 6
debug 7
debug 8.3 35 62
debug 2 https://api.tradier.com/v1/markets/options/expirations?symbol=VRTX&includeAllRoots=true
debug 2.5 {"expirations":{"date":["2020-04-24","2020-05-01","2020-05-08","2020-05-15","2020-05-22","2020-05-29","2020-06-05","2020-06-19","2020-07-17","2020-10-16","2021-01-15","2022-01-21"]}}
debug 4
debug 5.1
debug 6
debug 7
debug 8.1
resolve executed

, и журнал отладки 8.1 находится здесь в моем коде:

console.log("debug 8.1")
resolve(queryResponses);
console.log("resolve executed");

, что должно привести к:

apiHandler.dynamicQuery(args).then((expirations) => {
        console.log("debug 9")
        ... snip ...
}

И я не могу понять, с чего начать отладку того, что происходит между resolve() и .then(), чтобы вызвать тихую ошибку. Как я могу приступить к устранению этой проблемы?

Соответствующие методы:

// api handler class

dynamicQuery(queryArr, i = 0, queryResponses = []) {
    return new Promise((resolve, reject) => {
      this.query(...queryArr[i].args).then(result => {
        queryResponses.push(result);
        if (queryResponses.length == queryArr.length) {
          console.log("debug 7-pre")
          return resolve(queryResponses);
        }
        i++;
        let headers = result.response.headers;
        let availableRequests = parseInt(headers["x-ratelimit-available"]);
        let limitResetTime = parseInt(headers["x-ratelimit-expiry"]);
        let currentTime = parseInt((new Date()).getTime());
        let remainingTime = limitResetTime - currentTime;
        if (availableRequests > 0) {
          let requestChunkSize;
          let remainingQueries = queryArr.length - i - 1;
          if (remainingQueries < availableRequests) {
            requestChunkSize = remainingQueries;
          } else requestChunkSize = availableRequests;
          for (let j = 0; j <= requestChunkSize; j++) {
            this.query(...queryArr[i].args).then(result => {
              console.log("debug 7")
              queryResponses.push(result);
              if (queryResponses.length == queryArr.length) {
                console.log("debug 8.1")
                resolve(queryResponses);
                console.log("resolve executed");
              } else if (j >= requestChunkSize) {
                console.log("debug 8.2", j, requestChunkSize)
                if (i < queryArr.length - 1) {
                  this.dynamicQuery(queryArr, i, queryResponses);
                } else {
                  return resolve(queryResponses);
                }
              } else {
                console.log("debug 8.3", j, requestChunkSize)
              }
            }).catch(err => console.log(err));
            i++;
          }
        } else {
          setTimeout(() => {
            this.dynamicQuery(queryArr, i, queryResponses);
          }, remainingTime + 50)
        }
      }).catch(err => console.log(err));
    });
  }

// manager class

getExpirations(symbolList, target, range) {
    return new Promise((resolve, reject) => {
      let args = [];
      symbolList.forEach(symbol => {
        args.push({
          args: ["/v1/markets/options/expirations", {
            "symbol": symbol,
            'includeAllRoots': 'true',
          }, false]
        });
      });
      apiHandler.dynamicQuery(args).then((expirations) => {
        console.log("debug 9")
        //console.log("expirations", expirations.expirations)
        //console.log("expirations", JSON.stringify(expirations, null, 1))
        let processedResult = []
        expirations.forEach(expiration => {
          let validExpirationData = [];
          let expirationData;
          let expirationWithinRange;
          //console.log("expiration.response.body", expiration.response.body)
          if (expiration.response.body.expirations) {
            expirationData = expiration.response.body.expirations.date;
            expirationData.forEach(date => {
              if (momentUtil.isWithinRange(date, target, range)) validExpirationData.push(date);
            });
          }
          processedResult.push({
            symbol: expiration.qs.symbol,
            expirations: validExpirationData
          });
        })
        resolve(processedResult);
      }).catch(err => console.log(err));
    });
  }

Редактировать:

Если я запускаю скрипт навсегда, я получаю журнал:

debug 8.1
resolve executed
error: Forever detected script was killed by signal: undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...