winJS return 来自未定义函数的 var

winJS return var from function undefined

我想从本地硬盘获取图像。我的函数 returns 未定义。

function getImageFromLocal() {
    var imageurl = 0;
    return new WinJS.Promise(function () {
        picturesLib.getItemAsync("APP Folder X").then(function (appfolder) {
            appfolder.getItemAsync("Subfolder X").then(function (file) {
                file.getItemAsync("Image.jpg").done(function (image) {
                    imageurl = URL.createObjectURL(image);
                });
            });
        });
    });
  return imageurl;
}

当使用像 StorageFolder.getItemAsync 这样的异步 API 调用时,将最终结果分配给局部变量并尝试 return 是行不通的。

此外,在您的代码中,您有两个 return 语句,其中第一个 return 是一个承诺,其中包装了以结尾的承诺链中的 return 值.done,这是给你未定义的。第二条 return 语句永远不会到达,即使到达,也会 return 初始值 0 因为到那时异步代码将不会执行。

我会进一步指出,使用 new WinJS.Promise 根本不是您想要的,但我不会赘述细节。如果您真的想了解有关 promises 及其工作原理的完整故事,请参阅我的免费电子书 Programming Windows Store Apps with HTML, CSS, and JavaScript, Second Edition,包括第 3 章(基础知识)和附录 A(完整故事)。

回到你的代码,我不完全确定你想做什么。使用以 "Local" 命名的函数表明您正在尝试从应用程序数据中检索图像,但使用名为 picturesLib 的变量表明您来自图片库。让我分别解决每个问题。

首先,如果您使用的是本地应用数据,则只需使用 ms-appdata://[=36= 形式的 URI 即可绕过此处显示的整个过程.jpg.您可以将这样的 URI 直接分配给 img.src 属性,它就可以正常工作。这将同步工作,也适用于引用包内资源的 ms-appx:/// URI。

其次,在处理图像时,您无法方便地使用 URI 进行引用,您需要获取其 StorageFile 并将其传递给 URL.createObjectURL,您可以将其结果分配给 img.src还有,我想你知道。不过,为了省事,您可以使用带有 StorageFile.getFileAsync. This way you avoid having to write a promise chain to navigate a folder structure and reduce all that to a single call. That is, if pictureLib is the StorageFolder from Windows.Storage.KnownFolders.picturesLibrary 的完整相对路径,然后您可以只使用:

 picturesLib.getFileAsync("App folder X\subfolder x\image.jpg");

现在,对于您的原始函数,其目的是 return 该图像的 URI,它必须 return 本身是一个承诺,并且调用者将 .done 附加到该承诺得到结果。您可以通过 return 在 getFileAsync 的已完成处理程序中输入您想要的值来正确执行此操作,但请务必使用 .then,return 是该 return 值的承诺(.done 将 return未定义)。

function getPicturesLibUriAsync(relativePath) {
    return picturesLib.getFileAsync(relativePath).then(function (file) {
        return URL.createObjectURL(file);
    });
}

然后你像这样调用方法,使用 .done 得到异步结果:

getPicturesLibUriAsync("folder1\folder2\image1.jpg").done(function (uri) {
    someImageElement.src = uri;
});

同样,请参阅我的书以了解有关 promises 如何工作的完整详细信息,尤其是使用 .then 的 return 值。