如何在你的 datarequested 处理程序中进行异步调用 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

下面,我们将为你介绍如何异步生成数据,以响应 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