> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kasoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# arc:call

> 使用 arc:call 關鍵字呼叫 ArcScript 運算器，包括內建運算器、自定義指令碼和遠端指令碼。

export const siteNameShort = "知行之橋";

arc:call 關鍵字用來呼叫運算器。有效的運算器有以下幾種：

* 與應用程式的 bin 子資料夾中的應用程式集一起安裝的內建運算器
* 在 .NET 或 Java 中編寫的運算器，並放置在應用程式 bin 子資料夾下
* 呼叫同一臺計算機上現有的其它指令碼
* 使用 HTTP 呼叫的遠端計算機上的指令碼

運算器將物件作為輸入並傳回物件集作為輸出。在 arc:call 的範圍內，呼叫傳回的物件集中每個物件都會被執行。在 arc:call 範圍中，可以檢查和修改傳回的物件中的屬性。可以將這些運算器作為輸入提供給另一個運算器，從而就形成了一個運算器管道。或者，也可以將物件作為輸出。

## 輸出物件堆疊和預設物件

每次執行 arc:call 時，一個新物件會被推入到一個內部的物件堆疊中。在堆疊頂部的物件就是預設的物件。當未在呼叫輸入中明確指定物件名稱時，該物件為 arc:call 提供輸入。

被呼叫的運算器將屬性寫入到預設的物件中，[arc:push](./op-arc-push) 將預設的物件輸出。當推送一個物件時，只有在堆疊頂部的，預設物件的屬性會被推送。

在一個物件被迭代後，預設的物件會被清除，然後 arc:call 可以處理下一個物件。這意味著將不能在下一次 arc:call 迭代中讀取上一次迭代中設定的值。要在迭代中保留值，可以使用 [arc:set](./op-arc-set) 將其複製到一個已命名的物件。

可以將預設物件命名為 \_ ，或顯式命名為 \_out1, \_out2, \_out\[n]，其中N 是堆疊的深度。這就使得在執行過程中讀取所有可用的值。查詢過程從預設物件開始，並繼續在堆疊中查詢，直到找到一個值。

在下面的例子中，可以看到每次呼叫是如何將物件推到堆疊的頂部的，以及預設物件在每次呼叫的範圍內是如何變化的：

```xml theme={null}
<arc:call op="operation1"> 
The default item here is _out1 
A push here would push the attributes from _out1 
The input item used to call operation2 is also _out1 
<arc:call op="operation2"> 
The default item here is _out2 
A push here will push the attributes from _out2 
If there was another arc:call here the input item used would be _out2 
_out2 is swept clean here for the next iteration 
</arc:call> 
The default item here is again _out1 
A push here would again push the attributes from _out1 
The input item at this level is again _out1 
_out1 is swept clean here for the next iteration 
</arc:call> 
```

## 指定運算器的輸入

有三種方式可以為 call 提供輸入：

* 預設物件：如果輸入的物件未指定，被呼叫的運算器會從預設物件中讀取輸入值。可以使用 [arc:set](./op-arc-set) 關鍵字設定預設物件中的值，這樣就可以被呼叫的運算器處理。
  ```xml theme={null}
  <arc:set attr="mask" value="*.txt"/>
  <arc:set attr="path" value="C:\\"/>
  <arc:call op="fileListDir">
  ... 
  </arc:call>
  ```

* 顯式輸入物件：不使用預設物件，可以使用 **in** 參數來顯式指定要用作運算器輸入的物件。如果選擇這樣做，則不再使用預設物件，並且將從指定的輸入物件中讀取輸入值，如下所示，將查詢字串傳遞給運算器。
  ```xml theme={null}
  <arc:set attr="mask" value="*.* -- Will be ignored --"/>
  <arc:set attr="myinput.mask" value="*.txt"/>
  <arc:set attr="myinput.path" value="C:\\"/>
  <arc:call op="fileListDir" in="myinput">
  ... 
  </arc:call>
  ```

* 查詢字串參數：還可以使用查詢字串符號指定運算器的輸入。指定為查詢字串一部分的屬性具有優先順序。因此，如果查詢字串中指定的屬性與輸入物件中的屬性之間存在名稱衝突，則首選查詢字串中的屬性。但是，輸入物件的其它屬性仍然可以存取。下面的範例顯示了在查詢字串中指定輸入的語法：
  ```xml theme={null}
  <arc:set attr="myinput.mask" value="*.txt -- will be overridden --"/> 
  <arc:set attr="myinput.path" value="C:\\"/> 
  <arc:call op="fileListDir?mask=*.rsb" in="myinput">
  ...
  </arc:call>
  ```

## 參數

* **op**：被呼叫的運算器的名稱。

* **in\[put]**：呼叫運算器時用作輸入的物件清單。在指定的輸入物件中從左到右查詢屬性。

* **out\[put]**：放置輸出屬性的物件。在 arc:call 範圍內，可以使用此處指定的物件名稱來檢索當前輸出項物件。也可以使用 \_out\[n] 或 \_pipe 引用呼叫結果。

  <Note>在呼叫中設定的屬性在呼叫範圍外是不可用的。這是因為呼叫的每次迭代都會刪除上一次迭代的屬性；在呼叫結束後不會留下任何東西。要在呼叫的範圍之外存取屬性，使用 [arc:set](./op-arc-set) 去顯式將屬性複製到想在呼叫之外使用的物件中。</Note>

* **item**：用於輸入和輸出的物件名稱。

* **sep\[arator]**：用來分隔多個輸入物件的分隔符號。預設為逗號。

* **ignoreprefix**：以逗號分隔的字首清單，當查詢到時將被忽略。一些運算器傳回名稱形式為 “prefix:name” 的屬性（例如，arc:operation 和 sql:company）。在某些情況下，可能需要將 prefix:name 和 name 當作同一個屬性。

* **page and pagesize**：被迭代的物件的子集。用於啟用運算器或物件集結果的分頁。例如。如果指定 page="2" 且 pagesize="5"，arc:call 關鍵字僅對生成物件集的物件6到10進行迭代。

* **httpmethod**：運算器將使用的 HTTP 方法。

* **authtype**：透過 HTTP 存取物件集的所需的身分驗證型別。例如，“basic”或“digest”。

* **authtoken**：透過 HTTP 存取物件集所需的身分驗證的認證權杖。

* **user**：透過 HTTP 存取物件集所需的身分驗證的使用者名稱。

* **password**：透過 HTTP 存取物件集所需的身分驗證的密碼。

* **http\_headers**: 透過 HTTP 存取物件集所需的其它 HTTP 標頭。

* **proxyhost**：傳送 HTTP 請求的代理地址。

* **proxyport**：HTTP 代理正在執行的 TCP 端口。

* **proxyuser**：用於驗證 HTTP 代理的使用者名稱。

* **proxypassword**：用於驗證 HTTP 代理的密碼。

* **proxyauthtype**：代理所需的 HTTP 認證型別。例如，“basic” 或 “digest”。

* **proxyssltype**：當連線代理伺服器時使用的 TLS／SSL 型別。有效值有 AUTO，ALWAYS，NEVER 或 TUNNEL。預設值為 AUTO。

## 控制屬性

* **\_index**：arc:call 當前正在迭代的物件的索引。
* **\_op**：被呼叫的運算器的名稱。如果在執行之前不知道運算器的名稱，這將很有幫助。
* **\_separator**：用來分隔多個輸入物件的分隔符號。

## 範例

使用預設物件作為輸入呼叫一個運算器：

```xml theme={null}
<arc:set attr="path" value="C:\myfiles"/>
<arc:call op="fileListDir">
  <arc:push/>
</arc:call>
```

在遠端計算機上呼叫另一個指令碼。如上面的範例所示，指令碼是巢狀的。

```xml theme={null}
<arc:call op="http://someplace.com/customerList.rsb">
  <arc:push/>
</arc:call>
```

## 另請參閱

* [arc:first](./op-arc-first)：編寫只在呼叫的第一次迭代中執行的元素。
* [arc:catch](./op-arc-catch)：在呼叫中捕獲錯誤。
* [arc:continue](./op-arc-continue)：繼續下一次迭代。
