我想从我的本地硬盘获取图像。我的函数返回undefined。
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;
}
答案 0 :(得分:0)
使用StorageFolder.getItemAsync之类的异步API调用时,无法将最终结果分配给局部变量并尝试返回该变量。
此外,在你的代码中,你有两个return语句,第一个返回一个promise,里面包含一个以.done结尾的promises链的返回值,这就是给你未定义的。永远不会达到第二个return语句,即使它是,也会返回初始值0,因为到那时异步代码将不会被执行。
我会进一步指出,使用新的WinJS.Promise根本不是你想要的,但我不会详细说明。如果你真的想要关于承诺及其工作方式的完整故事,请参阅我的免费电子书Programming Windows Store Apps with HTML, CSS, and JavaScript, Second Edition,第3章(基础知识)和附录A(全文)。
回到你的代码,我不完全确定你要做什么。使用以“Local”命名的函数,您建议您尝试从应用程序数据中检索图像,但使用名为picturesLib的变量表明您来自图片库。让我分别解决这些问题。
首先,如果您正在使用本地appdata,只需使用 ms-appdata:/// local / folder1 / folder2 / image形式的URI,即可绕过此处显示的整个过程.JPG 。您可以将这样的URI直接分配给img.src属性,它就可以正常工作。这将同步工作,也适用于引用包内资源的ms-appx:/// URI。
其次,在处理图像时,无法使用URI方便地引用,您需要获取其StorageFile并将其传递给URL.createObjectURL,其结果也可以分配给img.src,我认为你懂。但是,为了省去一些麻烦,您可以使用StorageFile.getFileAsync的完整相对路径。这样您就可以避免编写承诺链来导航文件夹结构并将所有内容减少到单个调用。也就是说,如果pictureLib是来自Windows.Storage.KnownFolders.picturesLibrary的StorageFolder,那么你可以使用:
picturesLib.getFileAsync("App folder X\subfolder x\image.jpg");
现在,对于原始函数,其目的是返回该图像的URI,它必须返回一个promise本身,并且调用者将.done附加到该promise以获取结果。您可以通过在getFileAsync的已完成处理程序中返回所需的值来正确执行此操作,但请务必使用.then返回该返回值的承诺(.done将返回undefined)。
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;
});
再次,请参阅我的书,了解有关承诺如何运作的详细信息,尤其是使用.then的返回值。