Node.js的承诺 – 不应该等到.then完成()?
我很困惑这种asynchronous行为。
当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()
callback中,等待承诺解决。 它只会等到承诺被创build – 但承诺解决scheme(您称之为“完成”)是asynchronous的。 注意承诺不是魔术,它们只是callback 。
要修复你的代码,
- 在
createTokenFile
您需要从then
callback中return
refreshToken()
-
checkExpiredToken
不应该使用Promise
构造函数 -
refreshToken
应该总是返回一个承诺 - 没有理由为什么
refreshToken
会同步读取文件 - 您不应该将
token
caching为包含该值的全局variables
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版本)
Promise不要去同步代码。 一个asynchronous的函数将永远如此。 因此,如果refreshToken
是asynchronous的,那么它在上面的使用将不会等待它继续前进。
你的代码样本太多的想象力(更不用说语法不正确),所以更好的答案是不可用的。 也许尝试重新创buildjsbin.com或jsfiddle.net的情况。