由于某种原因,我的代码无法检索在调用Windows.Media.Capture.CameraCaptureUI()方法的captureFileAsync方法时返回的IAsyncOperation对象。根据{{3}}返回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对象吗?
谢谢!
答案 0 :(得分:1)
作为参考,这是我在MSDN论坛上发布的答案。
要回答结束问题,您可以通过取消dialog.captureFileAsync中的承诺来取消捕获UI。
您的InAsyncMode标志是未定义的,因为您正在为它分配来自captureFileAsync.done()的返回值,根据定义,该值是未定义的。它与API的成功无关。
在文档中,当您看到IAsyncOperation时,您在JavaScript中获得的是一个承诺,如果成功,它将作为结果传递给已完成的处理程序。您永远不会直接在JavaScript中看到IAsyncOperation或相关接口。 WinRT的文档编写为与语言无关,因此了解这些内容如何在JS中显示(作为承诺)非常重要。在C#中,您也没有看到它,因为您只使用await关键字。你实际上在C ++中遇到了这个界面。
无论如何,我相信你想要的是下面的代码,你可以消除IsAsyncMode,而只是检查一个非null的承诺:
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;
});