Próba interakcji z interfejsem API JS, ale kończy się niepowodzeniem po uruchomieniu przez zadanie Grunt; Myślę, że moja logika jest zdezorientowana. Moje kroki:zwraca obietnicę z funkcji executora?
- get tokeny z pliku, sprawdzić je (
check_tokens
) - jeśli są stare - odświeżyć je (
refresh_tokens
) - wywołanie API, aby odświeżyć, jeśli się nie powiedzie - dostać nowe (
authorize_with_api
) < - jest to kwestia - z
authorize_with_api
odrzucić z powodu błędu lub rozwiązać z tokenów
Obecnie zadanie Grunt zgłasza UnhandledPromiseRejectionWarning
i nigdy się nie kończy. Jeśli skomentuję połączenie z numerem authorize_with_api
, zostanie ono poprawnie zakończone z błędem i wydrukowany zostanie mój najwyższy komunikat .
Dlaczego nie mogę zwrócić obietnicy z funkcji executora? Co jest nie tak z moją logiką?
/* 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' wydaje się być zdefiniowana wewnątrz' 'authorize_with_api, miałaś na myśli, aby przekazać go w? Pokazanie Twojego zadania, które to nazywa, może być pomocne. –
Należy unikać tworzenia własnych promisyfikacji. Biblioteki zostały napisane, aby rozwiązać to zadanie, użyj jednego z nich. Na przykład bluebird może to dla ciebie zrobić. http://bluebirdjs.com/docs/api/promise.promisifyall.html – Tomalak
@ Tomalak Czy możesz wyjaśnić dalej? OP stosuje natywne obietnice? –