Node.js Promise中修改对象属性时,如何保证代码按顺序执行?
在Node.js Promise中确保代码顺序执行的方法
首先得给你掰扯清楚:你代码里的JSON.parse(result)[0]是同步操作,Node.js会老老实实等这行完全执行完,才会往下跑后续的代码——根本不需要额外做什么特殊处理!
你大概率是把同步操作和异步操作搞混了:只有像文件读写、网络请求、数据库查询这种需要等外部响应的异步任务,才会出现“代码没执行完就跳去下一行”的情况;而JSON.parse这种纯内存里的同步方法,是瞬间完成的,执行顺序严格从上到下。
不过你的代码其实还有个小细节可以优化,而且刚好借这个机会,给你讲清楚如果以后遇到真正的异步操作,该怎么确保代码按顺序执行:
针对你当前代码的优化(同步场景)
因为你的核心操作是同步的,原代码的执行顺序本来就符合预期,不过可以把代码写得更简洁(而且你用了async函数,其实没必要手动new Promise):
let getToken = async function (resultStr) { // JSON.parse是同步操作,执行完才会走下一行 const result = JSON.parse(resultStr)[0]; // 这行肯定是等上面解析完成后才会执行 result.token = jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: '1h' }); if (result.token) { console.log('Res:'+ result.Age); return result; // async函数里return相当于resolve } else { throw new Error('Failed to generate token'); // throw相当于reject } };
如果遇到异步操作该怎么处理
假设你有一个异步的解析方法(比如asyncParseJson,需要去读取文件或者调用接口获取数据),那就要用await来等待它完成,确保后续代码在它执行完后再运行:
let getToken = async function (resultStr) { // 用await等待异步操作完成,下面的代码会暂停到这行执行完才继续 const parsedData = await asyncParseJson(resultStr); const result = parsedData[0]; // 这行肯定在上面的异步解析完成后才执行 result.token = jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: '1h' }); if (result.token) { console.log('Res:'+ result.Age); return result; } else { throw new Error('Failed to generate token'); } };
要是你不习惯用async/await,用传统的Promise链式调用也行——把后续代码放在.then()回调里,就能保证顺序:
let getToken = function (resultStr) { return asyncParseJson(resultStr) .then(parsedData => { const result = parsedData[0]; result.token = jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: '1h' }); if (result.token) { console.log('Res:'+ result.Age); return result; } throw new Error('Failed to generate token'); }); };
最后总结一下:
- 同步操作(比如
JSON.parse、普通变量赋值、算术计算)本身就是按顺序执行的,不需要额外处理 - 异步操作必须用
await(在async函数里)或者Promise链式调用(.then())来确保后续代码在异步任务完成后再执行
内容的提问来源于stack exchange,提问作者Iman Salehi
相关产品推荐
相关产品推荐

