如何在你的 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());
}
};