如何在 datarequested 處理常式中進行非同步呼叫 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
本文說明如何以非同步方式產生資料,以回應 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());
}
};