Node.js Promise - 代码不应该等到 .then 完成()

Node.js Promise - Shouldn't code wait until .then is complete()?

本文关键字:then 完成 不应该 js Promise 代码 Node      更新时间:2023-09-26

我对这种异步行为感到困惑。

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()回调中。它只等到承诺被创建 - 但承诺解析(你称之为"完成")是异步的。请注意,承诺不是魔法,它们只是回调。

要修复您的代码,

  • createTokenFile中,您需要从then回调中return refreshToken()
  • checkExpiredToken不应使用 Promise 构造函数
  • 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);
        }
    });
}

(其中readFileAsyncfs.readFile的许诺版本)

承诺 不要取消同步代码。异步函数将始终如此。因此,如果refreshToken是异步的,那么上面的使用不会等待它完成再继续。

您的代码示例留下了太多的想象力(更不用说语法不正确了),因此没有更好的答案。也许尝试在 jsbin.com 或 jsfiddle.net 中重现这种情况。