Итак, у меня есть метод управления 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