我对这种异步行为感到困惑。
当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()
答案 0 :(得分:2)
Promise不会取消同步代码。 异步的函数将始终如此。因此,如果refreshToken
是异步的,那么上面的使用将不会等到它继续完成。
您的代码示例留下了太多的想象力(更不用说语法不正确),因此无法获得更好的答案。也许尝试在jsbin.com或jsfiddle.net重新创建这种情况。
答案 1 :(得分:2)
var tokenDate = new Date(token.expires);
在callApiToken().then(function() {refreshToken();})
执行之前是否应该等待完成?
不 - 它不在等待承诺解决的.then()
回调中。它只会等到承诺被创建 - 但承诺解决方案(你称之为"完成")是异步的。请注意,承诺不是魔术,它们是just callbacks。
要修复您的代码,
createTokenFile
中return
来自refreshToken()
回调的then
checkExpiredToken
应该not use the Promise
constructor refreshToken
应始终返回承诺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
的{{3}}版)