【发布时间】:2017-05-20 04:37:39
【问题描述】:
尝试与 JS API 交互,但被 Grunt 任务运行时失败;我觉得我的逻辑很混乱。我的步骤:
- 从文件中获取令牌,检查它们 (
check_tokens) - 如果它们是旧的 - 刷新它们 (
refresh_tokens) - 调用 API 刷新,如果失败 - 获取新的 (
authorize_with_api) - 来自
authorize_with_api错误拒绝或使用令牌解决
目前,Grunt 任务报告 UnhandledPromiseRejectionWarning 并且永远不会完成。如果我注释掉对authorize_with_api 的调用,它会正确退出并出现错误,我会打印出最上面的caught error! 消息。
为什么我不能从 executor 函数中返回一个 Promise?我的逻辑有什么问题?
/* 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内部未定义,您是要传入它吗?显示调用它的 gulp 任务可能会有所帮助 -
请避免做出自己的承诺。已编写库来解决此任务,请使用其中之一。例如,bluebird 可以为您完成。 bluebirdjs.com/docs/api/promise.promisifyall.html
-
@Tomalak 你能进一步解释一下吗? OP 使用的是原生 Promises?
-
@Tomalak 我对此并不精通 - 你能指出我现在在哪里“承诺” - 通过将 SDK 调用包装到 Promises 中?它有什么问题?
-
将 non-promise API 转换为 Promise API 并非易事,很容易出错(在这种情况下,OP 忘记使用 try/catch)。我不是说 OP 应该切换到 bluebird,我是说 OP 应该使用经过测试的库来实现承诺。
标签: javascript promise ecmascript-6 es6-promise