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

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

最佳答案

Shouldn't var tokenDate = new Date(token.expires); wait after callApiToken().then(function() {refreshToken();}) to finish before executing?

不 - 它不在等待 promise 解决的 .then() 回调中。它只等到创建 promise - 但 promise 解决(您称之为“完成”)是异步的。请注意, promise 不是魔法,它们是 just callbacks .

要修复您的代码,

  • createTokenFile 中,您需要从 then 回调中返回 refreshToken()
  • checkExpiredToken 应该 not use the Promise constructor
  • refreshToken 应该总是返回一个 promise
  • 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 版本)

关于javascript - Node.js Promise - 代码不应该等到 .then 完成()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954684/

相关文章:

javascript - 如何使用 javascript css 或 html attr 禁用 iOS 链接预览

javascript - 如何在 Vue 3 中为 axios 调用使用去抖功能

node.js - 无法在 NodeJS 中使用 native Windows 库

node.js - 使用 cloudbuild.yaml 部署 Google Cloud 函数 (Node JS) 时出错

javascript - 如何在 pdfmake 和 html2pdfmake 中处理 SVG 和 canvas

javascript - 难以遍历数组对象并从 Redux Store 中生成 JSX 中的动态 React 元素

javascript - 动态返回配置值(node.js)

javascript - 创建可重用的 promise 链并将其应用到其他 promise 上

javascript - jQuery jqXHR deferreds 无法与 $.when(...) 链接

angularjs - Angular $http promise 总是解决