Node.js Promise - 代码不应该等到 .then 完成()
Node.js Promise - Shouldn't code wait until .then is complete()?
我对这种异步行为感到困惑。
当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);
}
});
}
(其中readFileAsync
是fs.readFile
的许诺版本)
承诺 不要取消同步代码。异步函数将始终如此。因此,如果refreshToken
是异步的,那么上面的使用不会等待它完成再继续。
您的代码示例留下了太多的想象力(更不用说语法不正确了),因此没有更好的答案。也许尝试在 jsbin.com 或 jsfiddle.net 中重现这种情况。
相关文章:
- 如何使用jquery在填充自动完成的值后使文本框只读
- jQuery UI自动完成突然停止工作
- 如何通过php页面将数据库值检索到jquery自动完成框中
- 如何确定javascript已经完成了某些操作.ios上的
- Rails/JSON:如何将JSON用于jquery UI自动完成表单
- 在数据提取完成之前进行页面渲染
- jQuery自动完成阻止选择后聚焦
- Jquery UI自动完成无法工作
- 错误:对象没有't支持'自动完成'
- 将谷歌自动完成地址信息放在页面上,而不是表格中
- Highchart:endOnTick没有完成xaxis的最大极限设置
- Node.js Promise - 代码不应该等到 .then 完成()
- 然后 .then() 函数似乎在承诺完成之前运行
- 为什么我的 jQuery when().then() 函数在 ajax 请求完成之前触发
- 等待所有异步ajax调用完成,并延迟.when().then(),未调用then()中的任务
- 我需要把'return'casper.then'块,让父函数等待子函数完成执行
- 无法读取property 'then'使用Angular材质自动完成
- 等待promise和nested then完成
- 链式jQuery.then() -每个下一个只在前一个解析完成后执行
- 我如何在不使用完成回调的情况下在mocha中链接多个then