Node.js承诺 - 不应该等待代码直到.then完成()?

时间:2015-03-10 01:22:53

标签: javascript node.js promise

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

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()

2 个答案:

答案 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);
        }
    });
}

(其中readFileAsyncfs.readFile的{​​{3}}版)