我对这种异步行为感到困惑。
当token
是false
时,refreshToken()
函数会运行,但createTokenFile()
不会等待它完成。var tokenDate = new Date(token.expires);
是否不应该在callApiToken().then(function() {refreshToken();})
之后等待执行才能执行?
function createTokenFile() {
console.log("No token-file.json file found. " .red +
"Please complete for a new one." .red);
return callApiToken().then(function() {
refreshToken();
});
}
function checkExpiredToken() {
return new Promise(function(resolve, reject) {
if (!token) {
refreshToken();
}
var tokenDate = new Date(token.expires);
var utc = new Date().toUTCString();
var now = new Date(utc);
}
function refreshToken() {
try {
var tokenFile = path.join(__dirname, 'token-file.json');
console.log(tokenFile);
return token = JSON.parse(fs.readFileSync(tokenFile, {encoding: 'utf-8'}));
} catch (err) {
if (err.code !== 'ENOENT') {
throw err;
} else {
return createTokenFile();
}
}
}
用
refreshToken()
更新 最佳答案
var tokenDate = new Date(token.expires);
是否不应该在callApiToken().then(function() {refreshToken();})
之后等待执行才能执行?
否-它不在.then()
回调中,该回调将等待承诺解决。它只等到创建承诺后才开始-但承诺解决方案(您称为“完成”)是异步的。注意,诺言不是魔术,而是just callbacks。
要修复您的代码,
在createTokenFile
中,您需要从return
回调中refreshToken()
then
checkExpiredToken
应该not use the Promise
constructorrefreshToken
应始终返回承诺
没有理由refreshToken
会同步读取文件
您不应该将token
缓存为包含值的全局变量
function createTokenFile() {
console.log("No token-file.json file found. " +
"Please complete for a new one.");
return callApiToken();
}
function checkExpiredToken() {
return (tokenPromise || refreshToken())
.then(function(token) {
var tokenDate = new Date(token.expires);
var utc = new Date().toUTCString();
var now = new Date();
});
}
function refreshToken() {
var tokenFile = path.join(__dirname, 'token-file.json');
console.log(tokenFile);
return tokenPromise = readFileAsync(tokenFile, {encoding: 'utf-8'}))
.then(JSON.parse)
.catch(function(err) {
if (err.code !== 'ENOENT') {
throw err;
} else {
return createTokenFile().then(refreshToken);
}
});
}
(其中
readFileAsync
是fs.readFile
的promisified版本)