Node.js的承诺 – 不应该等到.then完成()?

我很困惑这种asynchronous行为。

tokenfalserefreshToken()函数会运行,但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您需要从thencallback中return refreshToken()
  • checkExpiredToken不应该使用Promise构造函数
  • refreshToken应该总是返回一个承诺
  • 没有理由为什么refreshToken会同步读取文件
  • 您不应该将tokencaching为包含该值的全局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的情况。