【问题标题】:Return value is coming back as undefined返回值以未定义的形式返回
【发布时间】:2019-07-16 21:46:32
【问题描述】:

我正在尝试为 Illustrator 编写一个脚本,该脚本将从对象中读取我需要的颜色,然后在需要的地方用该颜色填充模板。它一直返回未定义。我对 Javascript 很陌生,有什么想法我做错了吗?

我尝试以newCMYKColor[stockColor]newCMYKColor[stockColors] 的身份返回并返回stockColor[newCMYKColor]

convertRoofColorToCMYK = function(stockColor) {
  var newCMYKColor = new CMYKColor(),
    stockColors = {
      BlackPoly: [80, 72, 68, 100],
      LightBlue: [100, 43, 0, 30],
      DarkBluePoly: [95, 74, 7, 44],
      PurplePoly: [82, 98, 0, 12],
      GreenPoly: [90, 12, 95, 40],
      YellowPoly: [0, 19, 89, 0],
      EcruPoly: [6, 13, 41, 4],
      OrangePoly: [0, 73, 98, 0],
      RedPoly: [7, 100, 82, 26],
      GreyPoly: [10, 4, 4, 14],
      WhitePoly: [0, 0, 0, 0]
    };
  try {
    newCMYKColor.cyan = stockColors[stockColor][0];
    newCMYKColor.magenta = stockColors[stockColor][1];
    newCMYKColor.yellow = stockColors[stockColor][2];
    newCMYKColor.black = stockColors[stockColor][3];
  } catch (e) {
    newCMYKColor.cyan = 0;
    newCMYKColor.magenta = 0;
    newCMYKColor.yellow = 0;
    newCMYKColor.black = 0;
  }
  return newCMYKColor;
};

roofColorCMYK = convertRoofColorToCMYK(Clipboard.roof_color);

if (!roofColorCMYK == undefined) {
  if (app.activeDocument.Layers["Tent Pieces"] &&
    app.activeDocument.Layers["Tent Pieces"].Layers["Roof Composite"]) {
    for (i = 0; i < app.activeDocument.Layers["Tent Pieces"].Layers["Roof Composite"].pathItems.length; i++) {
      app.activeDocument.Layers["Tent Pieces"].Layers["Roof Composite"].pathItems[i].fillColor = roofColorCMYK;
    } else {
      alert("sorry we are not able to fill the tent roof with the " +
        Clipboard.roof_color + " color.")
    }

在我添加 else/if 语句之前,它告诉我 if (app.activeDocument.Layers["Tent Pieces"] &amp;&amp; app.activeDocument.Layers["Tent Pieces"].Layers["Roof Composite"]) 未定义。添加 else/if 语句后,它每次都会给我警报。

【问题讨论】:

  • 我认为!roofColorCMYK == undefined(不是)条件永远不会是true,因为您正在将您的值转换为真值或假值。而convertRoofColorToCMYK 永远不会返回 undefined 因为你总是返回一个值。你能记录下roofColorCMYK 的值吗?

标签: javascript adobe return-value adobe-illustrator object-literal


【解决方案1】:

请查看 MDN 规范中的 try catch 块。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch.

您必须记住,在 try catch 块之后不会执行任何代码。

我建议你这样改变你的代码:

try {
    newCMYKColor.cyan = stockColors[stockColor][0];
    newCMYKColor.magenta = stockColors[stockColor][1];
    newCMYKColor.yellow = stockColors[stockColor][2];
    newCMYKColor.black = stockColors[stockColor][3];

    return newCMYKColor;
  } catch (e) {
    newCMYKColor.cyan = 0;
    newCMYKColor.magenta = 0;
    newCMYKColor.yellow = 0;
    newCMYKColor.black = 0;

    return newCMYKColor;
  }

或者在最后使用 finally 块(finally 中的代码总是按照之前发生的情况执行)。

try {
    newCMYKColor.cyan = stockColors[stockColor][0];
    newCMYKColor.magenta = stockColors[stockColor][1];
    newCMYKColor.yellow = stockColors[stockColor][2];
    newCMYKColor.black = stockColors[stockColor][3];
  } catch (e) {
    newCMYKColor.cyan = 0;
    newCMYKColor.magenta = 0;
    newCMYKColor.yellow = 0;
    newCMYKColor.black = 0;
  } finaly {
    return newCMYKColor;
  }

【讨论】:

  • 这似乎奏效了!它不再给我一个未定义的值,但我认为我的图层现在可能只是问题所在。谢谢!
  • 你能指定任何说这个的资源你必须记住在try catch块之后不会执行任何代码。?不正确
  • @ajuni880 这是我在阅读此 MDN paragraphe 时所理解的。 有一个特殊的异常相关子句不管是否存在异常都会执行,这可能看起来很奇怪,但这个结构确实有一个目的。重要的一点不是 finally 子句总是执行,而是 try...catch 之后的普通代码不会。
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 2021-09-22
  • 2020-09-27
  • 2019-04-10
  • 2021-08-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
相关资源
最近更新 更多