本文介绍了在 adobe Illustrator 脚本中实现异步执行的可能性。由于传统的 ExtendScript 缺乏异步/await 支持,因此无法直接实现。文章讨论了 UXP 脚本和 CEP 面板脚本的可能性,但目前 UXP 尚未支持 Illustrator,而 CEP 脚本在访问文档内容时仍需依赖 ExtendScript,因此无法完全实现异步执行。
ExtendScript 的局限性
传统的 Adobe Illustrator 脚本,通常使用 ExtendScript (JSX) 编写。ExtendScript 是 Adobe 基于 JavaScript 的一种脚本语言变体,它提供了访问和操作 Illustrator 文档对象模型的接口。然而,ExtendScript 的一个主要限制是它不支持异步编程。这意味着你无法直接使用 async/await 或其他异步编程模式来执行函数。
例如,以下代码段尝试模拟异步执行,但实际上是同步执行的:
function runThisScript() { var doc = app.activeDocument; doc.selection = null; var layer = doc.activeLayer; var layer = doc.layers.getByName("Layer 1"); doc.activeLayer = layer; prepareToScript(); selectTextObjects(); mergeTextObjects(); if (processAllChk.value) { processAllNames(); app.preferences.setStringPreference(allKey, "true"); } if (moveNamesChk.value) { moveNamesToNewLayer(); } else { if (!wasTrans) { leaveNamesOnCurrentLayer(); } moveNamesToNewLayer(); } }
在这个例子中,prepareToScript()、selectTextObjects() 和 mergeTextObjects() 等函数会依次同步执行,阻塞主线程,直到所有函数执行完毕。这可能会导致 Illustrator 界面卡顿,尤其是在处理大量数据时。
UXP 脚本的可能性 (理论上)
Adobe 推出了新的 UXP (Unified Extensibility Platform) 脚本平台,旨在取代 ExtendScript。UXP 脚本使用现代 JavaScript,并支持 async/await 等异步编程特性。
然而,目前 UXP 尚未正式支持 Adobe Illustrator。这意味着你无法使用 UXP 脚本直接操作 Illustrator 文档对象模型。虽然未来 UXP 可能会支持 Illustrator,但这仍然是一个未知数。
CEP 面板脚本的局限性
CEP (Common Extensibility Platform) 面板允许你使用 html、css 和 JavaScript 创建自定义的 Illustrator 扩展面板。CEP 面板脚本可以使用现代 JavaScript,并支持异步编程。
但是,CEP 面板脚本只能在面板内部运行,无法直接访问 Illustrator 文档对象模型。要操作文档内容,你需要通过 CSInterface 对象调用 ExtendScript 代码。这意味着你仍然需要受到 ExtendScript 的同步执行限制。
例如,你可以在 CEP 面板中使用以下代码调用 ExtendScript 函数:
const csInterface = new CSInterface(); function callExtendScriptFunction() { csInterface.evalScript('myExtendScriptFunction()', (result) => { console.log('ExtendScript function result:', result); }); }
虽然 callExtendScriptFunction() 函数本身是异步的,但 myExtendScriptFunction() 函数仍然会在 ExtendScript 环境中同步执行。
结论
目前,在 Adobe Illustrator 脚本中实现真正的异步执行仍然是一个挑战。传统的 ExtendScript 缺乏异步支持,而 UXP 尚未支持 Illustrator。CEP 面板脚本虽然可以使用异步编程,但在访问文档内容时仍然需要依赖 ExtendScript。
因此,在编写 Illustrator 脚本时,需要仔细考虑性能问题,并尽量避免长时间的同步操作。你可以尝试优化代码,减少计算量,或者将任务分解成更小的块,并使用 setTimeout() 等方法来模拟异步执行,但这并不能完全解决问题。
希望未来 Adobe 能够推出更好的解决方案,以便开发者能够更轻松地编写高性能的 Illustrator 脚本。
评论(已关闭)
评论已关闭