我正在使用Adobe CEP(它允许开发人员为 Adobe CC 产品创建窗口扩展)。我的大部分代码是现代 JavaScript(该平台使用 Chromium 57、Node.js 7.7.4)。 但是,为了访问 DOM,我需要在 Adob e ExtendScript中编写一些函数并从普通 JS 中执行它们。唯一的方法是使用他们提供的csInterface.evalScript(script, callback)
. script
必须是一个字符串,在我的例子中是一个转换为字符串的函数调用。我希望能够通过 ExtendScript 将对象传入和传出evalScript
,但evalScript
只接受并返回一个字符串。
目前,我将每个对象属性作为其自己的参数传递。这很笨拙,但它有效。
我的第一个虽然是JSON.stringify()
,但不幸的是,ExtendScript 是 ECMAScript 3 的方言,这意味着不JSON.parse()
支持。
我不能只是将对象参数连接到脚本函数调用中,因为这样字符串的计算结果为foo([object Object])
.
我已经看到有eval()
/ uneval()
or之类的功能Object.toSource()
,但是 Chromium 不支持这些功能。
这是一个示例,类似于我当前的方法:
函数.js (ES3/ExtendScript)
function drawCircle(x, y, name) {
// pick a layer
var layer = app.activeDocument.layers[0];
var diameter = 10;
var top = y + diameter / 2;
var left = x - diameter / 2;
// draw ellipse in layer
var circle = layer.pathItems.ellipse(top, left, diameter, diameter);
circle.name = name;
circle.filled = true;
return true;
}
应用程序.js (ES6)
const csInterface = new CSInterface(); // provided by Adobe
async function circle() {
const dataObject = {x: 10, y: 10, name: 'Hello world!'};
// the script to call
// evaluates to drawCircle(10,10,'Hello world!');
const script = "drawCircle(" + dataObject.x + "," + dataObject.y + ",'" + dataObject.name + "');";
return new Promise((resolve, reject) => {
csInterface.evalScript(script, (result) => {
resolve(result);
});
});
}
正如预期的那样,circle()
调用drawCircle()
很好,并且我正在处理的文档中出现一个椭圆。但是,通过连接执行脚本/调用函数感觉非常错误。所以总而言之,
- 我想要一些(更整洁的)方式
dataObject
变成字符串并将其传递给drawCircle()
viaevalScript()
, - 我想
dataObject
从那里返回drawCircle()
并作为一个对象接收它。目前,返回一个对象只会产生"[object Object]"
一个返回值。