DataRequested ハンドラーで非同期呼び出しを行う方法 (HTML)

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

ここでは、datarequested イベントに応じてデータを非同期的に生成する方法を示します。 datarequested イベントに応じて非同期操作を行う場合は、最初に DataRequestDeferral オブジェクトを取得する必要があります。保留オブジェクトを取得することで、委任の終了後にデータを DataPackage に追加する呼び出しを行う可能性があることをシステムに知らせます。

  単にテキストリンクを共有するだけであれば、このトピックのコードは不要です。setText メソッドや setUri メソッドを使う方が簡単です。

 

理解しておく必要があること

テクノロジ

必要条件

  • 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