Попытка взаимодействия с JS API, но сбой при выполнении задачи Grunt; Я думаю, что моя логика смущена. Мои шаги:вернуть обещание от функции исполнителя?
- получение маркеров из файла, проверить их (
check_tokens
) - , если они старые - обновить их (
refresh_tokens
) - вызовов API, чтобы обновить, если не удается - получить новые (
authorize_with_api
) < - это вопрос - из
authorize_with_api
отклонять с ошибкой или решить с жетонами
в настоящее время задача Grunt сообщает об UnhandledPromiseRejectionWarning
и никогда не заканчивается. Если я прокомментирую звонок на authorize_with_api
, он автоматически выйдет с ошибкой, и я получу свое самое верхнее сообщение caught error!
.
Почему я не могу вернуть обещание из функции исполнителя? Что случилось с моей логикой?
/* global sdk, config, tokens */
return getTokens().then((p_tokens) => {
tokens = p_tokens;
return check_tokens(tokens);
}).then((tokens) => {
console.log('then() is called!');
}).catch((err) => {
console.error('caught error!', err);
});
function check_tokens(tokens) {
if(are_old(tokens)) { // returns true
return refresh_tokens(tokens);
}
return Promise.resolve(tokens);
}
function refresh_tokens(tokens) {
return new Promise(function(resolve, reject) {
sdk.refreshTokens(tokens.refresh_token, function(err, new_tokens) {
if(err) {
if(error.code === 'invalid_grant') {
return authorize_with_api();
}
reject('refreshTokens failed');
} else if(newTokens) {
resolve(new_tokens);
}
});
});
}
function authorize_with_api() {
return new Promise(function(resolve, reject) {
sdk.getTokens(config.auth_code, function(err, tokens) {
if(err) {
reject('getTokens failed');
} else if(tokens) {
resolve(tokens);
}
});
});
}
'tokens' кажется неопределенным внутри' 'authorize_with_api, вы имели в виду, чтобы передать его в? Показать вашу задачу глотки, которая вызывает это может быть полезно –
Пожалуйста, не делайте свое собственное обещание. Для решения этой задачи были написаны библиотеки, используйте один из них. Например, bluebird может сделать это за вас. http://bluebirdjs.com/docs/api/promise.promisifyall.html – Tomalak
@Tomalak Можете ли вы объяснить подробнее? ОП использует собственные обещания? –