如何在 datarequested 處理常式中進行非同步呼叫 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

本文說明如何以非同步方式產生資料,以回應 datarequested 事件。 如果您的應用程式執行任何回應 datarequested 事件的非同步作業,需要先取得 DataRequestDeferral 物件。取得延遲物件會讓 系統知道將 資料新增到 DataPackage 的呼叫會在委派傳回後發生。

注意  如果您只是分享文字連結,則不要需要使用這個主題中的程式碼。使用 setTextsetUri 方法會比較快速。

 

您必須知道的事

技術

先決條件

  • 您應該熟悉 Microsoft Visual Studio 以及相關範本。
  • 您應該熟悉 JavaScript。
  • 您必須了解如何取得檔案和其他資料,例如使用 FileOpenPicker

指示

步驟 1: 將您的應用程式設定成分享來源

DataTransferManager 物件是任何分享作業的主起點。您將在應用程式的 activated 事件處理常式中 DataTransferManager 物件上新增一個 datarequested 事件處理常式。當使用者叫用分享常用鍵時,就會發生 datarequested 事件。

var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
    dataTransferManager.addEventListener("datarequested", shareAsyncHandler);

剩餘的步驟是實作 shareAsyncHandler 函式。

步驟 2: 取得 DataRequest 物件

發生 datarequested 事件後,應用程式會收到 DataRequest 物件。這個物件有一個 DataPackage,您可以用它來提供使用者想分享的內容。

var request = e.request;

步驟 3: 設定標題和描述屬性

request.data.properties.title = "Async Share Example";
request.data.properties.description =
    "Demonstrates how to make asynchronous calls from a datarequested event handler.";

步驟 4: 取得延遲物件

若要取得延遲物件,請呼叫 getDeferral

var deferral = request.getDeferral();

步驟 5: 進行非同步呼叫以準備資料

您可以使用 DataPackage 支援的任何方法新增內容。這裡,我們使用 setStorageItems 來分享檔案。

Windows.ApplicationModel.Package.current.installedLocation.getFileAsync("images\\logo.png").done(function (storageFile) {
    request.data.setStorageItems([storageFile]);
});

步驟 6: 呼叫完成方法

DataRequestDeferral.complete 方法可讓系統知道資料已準備好可以分享。

deferral.complete();

您也必須在非同步呼叫的錯誤處理常式中呼叫 DataRequestDeferral.complete

完整範例

function shareAsyncHandler(e) {
    var request = e.request;
    request.data.properties.title = "Async Share Example";
    request.data.properties.description = 
        "Demonstrates how to make asynchronous calls from a datarequested event handler.";
    var deferral = request.getDeferral();
    Windows.ApplicationModel.Package.current.installedLocation.getFileAsync("images\\logo.png").done(function (storageFile) {
        request.data.setStorageItems([storageFile]);
        deferral.complete();
    }, function (err) {
        deferral.complete();
    });
}

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // This app was recently launched; register it as share source.
            var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
            dataTransferManager.addEventListener("datarequested", shareAsyncHandler);
        } else {
            // TODO: This app was reactivated from suspension.
            // Restore the app state here.
        }
        args.setPromise(WinJS.UI.processAll());
    }
};

相關主題

分享內容來源應用程式範例

分享和交換資料

如何支援提取作業

快速入門:分享內容

DataPackage

Windows.ApplicationModel.DataTransfer

Windows.ApplicationModel.DataTransfer.Share