Windows 8 CameraCaptureUI.captureFileAsync无法返回IAsyncOperation对象

Windows 8 CameraCaptureUI.captureFileAsync无法返回IAsyncOperation对象,windows-8,winjs,Windows 8,Winjs,由于某些原因,我的代码无法检索调用Windows.Media.Capture.CameraCaptureUI()方法的captureFileAsync方法时返回的IAsyncOperation对象。IAsyncOperation对象根据返回。在该文档链接中,它指出: Return value Type: IAsyncOperation<StorageFile> When this operationcompletes, a StorageFile object is returned

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

Return value
Type: IAsyncOperation<StorageFile>
When this operationcompletes, a StorageFile object is returned.
当我检查appSession.InAysncMode的值时,我看到函数返回
undefined
。我怀疑它返回
undefined
,因为操作尚未完成(即用户尚未创建照片,并且尚未保存到光盘),但我需要它以编程方式取消相机捕获模式。有人知道为什么它会返回undefined而不是记录在案的IAsyncOperation对象吗


谢谢

以下是我在MSDN论坛上发布的答案,仅供参考

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

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

在文档中,当您看到IAsyncOperation时,您在JavaScript中得到的是一个承诺,如果成功,它将作为结果交付给完成的处理程序。您永远不会直接在JavaScript中看到IAsyncOperation或相关接口。WinRT的文档是以语言中立的方式编写的,因此理解这些东西在JS中的表现(作为承诺)是很重要的。在C#中,您也看不到它,因为您只使用wait关键字。在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;
});

我一定很喜欢win8鬼城…我决定把这个问题发到那些论坛上,一天之内就得到了答案!