Как выполнять асинхронные вызовы в обработчике 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 — это основная начальная точка любой операции общего доступа. Вы добавите обработчик события datarequested для объекта DataTransferManager в обработчике события activated вашего приложения. Событие 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