0

出于某种原因,我的代码无法检索调用 Windows.Media.Capture.CameraCaptureUI() 方法的 captureFileAsync 方法时返回的 IAsyncOperation 对象。根据此文档返回 IAsyncOperation 对象。在该文档链接中,它指出:

Return value
Type: IAsyncOperation<StorageFile>
When this operationcompletes, a StorageFile object is returned.

所以这是我的代码:

var dialog = new Windows.Media.Capture.CameraCaptureUI();
var aspectRatio = { width: 4, height: 3 };

dialog.photoSettings.croppedAspectRatio = aspectRatio;
appSession.InAsyncMode = dialog.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).done(function (file) {
        if (file) {
            self.addPage(URL.createObjectURL(file));
        } else {
            WinJS.log && WinJS.log("No photo captured.", "sample", "status");
        }
    }, function (err) {
            // None taken
    });

当我检查 appSession.InAysncMode 的值时,我看到函数返回undefined. 我怀疑它返回undefined是因为操作未完成(即用户尚未创建照片,并且尚未将其保存到光盘),但我需要它以通过编程方式取消相机捕获模式。有谁知道为什么它会返回 undefined 而不是记录的 IAsyncOperation 对象?

谢谢!

4

1 回答 1

1

作为参考,这是我在 MSDN 论坛上发布的答案。

要回答您的结束问题,您可以通过从 dialog.captureFileAsync 取消承诺来取消捕获 UI。

您的 InAsyncMode 标志未定义,因为您为其分配了 captureFileAsync.done() 的返回值,根据定义,该值未定义。它与 API 的成功无关。

在文档中,当您看到 IAsyncOperation 时,您在 JavaScript 中得到的是一个承诺,如果它成功,它将作为结果传递给已完成的处理程序。您永远不会直接在 JavaScript 中看到 IAsyncOperation 或相关接口。WinRT 的文档是为语言中立而编写的,因此了解这些内容在 JS 中是如何出现的(作为 Promise)很重要。在 C# 中,您也看不到它,因为您只使用 await 关键字。您实际遇到的接口主要是在 C++ 中。

无论如何,我相信你想要的是类似于下面代码行的东西,你可以在其中消除 IsAsyncMode 以支持仅检查非空承诺:

appSession.capturePromise = dialog.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo);
appSession.IsAsyncMode = (appSession.capturePromise != null);


//This will close the capture UI after 5 seconds--replace with whatever logic you need
setTimeout(function () { appSession.capturePromise.cancel(); }, 5000);

appSession.capturePromise.done(function (file) {
    if (file) {
    } else {
    }
}, function (err) {
    appSession.IsAsyncMode = false;
    appSession.capturePromise = null;
});
于 2013-09-11T16:44:13.907 回答