JS API ile etkileşim kurmaya çalışıyor ancak bir Grunt görevi tarafından çalıştırıldığında başarısız oluyor; Sanırım mantığım karıştı. Benim adımlar: dosyadanBir yürütücü işlevinden bir söz döndürmek?
- olsun belirteçleri, eski ise (
check_tokens
) - onları kontrol - yenilemek için (
refresh_tokens
) - çağrı API bunları yenilemek, başarısız olursa - yenilerini almak (
authorize_with_api
) < - Bu
Şu Grunt görevi birraporları authorize_with_api
den
authorize_with_api
numaralı aramayı görüştüğümde bir hatayla düzgün şekilde çıkar ve en üstteki caught error!
mesajım yazdırılır. Neden yürütme işlevinden bir söz veremiyorum? Mantığımın nesi var? Bir söz gidermezse bir Promise yapıcısı (veya bunun içindeki herhangi bir fonksiyonu) dönen
/* 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);
}
});
});
}
', içeri geçmek demek istedi? Bunu çağıran görevinizi göstermek yararlı olabilir –
Lütfen kendi promisitenizi yapmaktan kaçının. Bu görevi çözmek için kütüphaneler yazılmıştır, bunlardan birini kullanın. Örneğin, bluebird sizin için yapabilir. http://bluebirdjs.com/docs/api/promise.promisifyall.html – Tomalak
@Tomalak Daha fazlasını açıklayabilir misiniz? OP yerli Promises kullanıyor? –