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

tokenfalse时,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 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);
        }
    });
}


(其中readFileAsyncfs.readFilepromisified版本)

09-25 19:32