bluebird promise catch()没有使用Promise.CancellationError调用内部函数

时间:2015-03-10 04:16:30

标签: javascript node.js promise bluebird

当文件丢失时,我试图取消承诺。但是,当我这样做时,我在输出中看到:

Unhandled rejection Error: ENOENT, open '/home/one/github/infrastructure_manager_ui/gulp/util/token-file.json'
  at Error (native)

并且createTokenFile()也没有按预期运行。不确定我做错了什么:

 function refreshToken() {
        var tokenFile = path.join(__dirname, 'token-file.json');
        return tokenPromise = fs.readFileAsync(tokenFile, {encoding: 'utf-8'})
        .then(JSON.parse)
        .cancellable()
        .catch(Promise.CancellationError, function(err) {
            console.log(err);
            if (err.code !== 'ENOENT') { 
                throw err;
            } else {
                createTokenFile();
                tokenPromise.cancel();
            }
        });
}

1 个答案:

答案 0 :(得分:1)

.cancellable()在这里没有做任何事情。 .cancellable()将一个承诺变为一个可以手动取消。你没有做任何事情来取消它,所以它没有被取消。

如果你想捕获文件读取错误,你应该抓住它:

function refreshToken() {
        var tokenFile = path.join(__dirname, 'token-file.json');
        return tokenPromise = fs.readFileAsync(tokenFile, {encoding: 'utf-8'})
        .then(JSON.parse)
        .catch(function(err) {
            console.log(err);
            if (err.code !== 'ENOENT') { 
                throw err;
            } else {
                return createTokenFile();
            }
        });
}