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 值。
我想从本地硬盘获取图像。我的函数 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 值。