VSCode API中Thennable相关代码等价性咨询
嘿,这个问题我之前踩过一模一样的坑!核心问题确实出在reduce的用法细节上,咱们来拆解清楚:
为什么reduce版本只执行首次插入?
问题根源在于你在reduce的回调函数里没有正确返回链式的Thennable/Promise。举个例子,假设你的reduce代码大概是这样:
const editOperations = [edit1, edit2, edit3]; editOperations.reduce((prev, edit) => { prev.then(() => workspace.applyEdit(edit)); }, Promise.resolve());
这里的回调函数没有返回prev.then(...)的结果,导致每一轮迭代的prev始终是最初的Promise.resolve(),后续的applyEdit根本没被加入异步执行链里——相当于只有第一个编辑被绑定到了初始Promise上,后面的全丢了。
手动展开版本为什么正常?
手动链式调用的写法相当于显式维护了异步执行链:
Promise.resolve() .then(() => workspace.applyEdit(edit1)) .then(() => workspace.applyEdit(edit2)) .then(() => workspace.applyEdit(edit3));
每一步then都会返回新的Promise/Thennable,确保下一个编辑操作在前一个完成后才执行,自然能按顺序完成三次插入。
正确的reduce写法应该怎么改?
你需要在reduce的回调里明确返回prev.then(...)的结果,让异步操作链持续传递下去:
const editOperations = [edit1, edit2, edit3]; editOperations.reduce((prevPromise, currentEdit) => { return prevPromise.then(() => { return workspace.applyEdit(currentEdit); }); }, Promise.resolve());
或者用更简洁的箭头函数写法(注意:单行箭头函数没有大括号时会自动返回表达式结果,加了大括号必须显式写return):
editOperations.reduce((prev, edit) => prev.then(() => workspace.applyEdit(edit)), Promise.resolve());
额外提醒
VSCode的Workspace.applyEdit返回的Thennable和标准Promise完全兼容,所以异步链式调用的逻辑和普通Promise一致——只要保证每一步都返回下一个异步操作的结果,就能按顺序执行所有编辑。
内容的提问来源于stack exchange,提问作者MilesMcBain
相关产品推荐
相关产品推荐

