在调用程序中获取函数从文件中读取的值:Windows应用商店JavaScript应用程序

Get value read from file by a function back in caller : Windows Store JavaScript App

本文关键字:应用 Windows 应用程序 JavaScript 读取 获取 程序 调用 函数 文件      更新时间:2023-09-26

我已经编写了以下代码[Windows Store JavaScript App]:

function get_ver(){
     get_text("verfile");
     // how to get value read by get_text [i.e. variable filedata] in this function??? 
}

function get_text(filepath) {
var p = "ms-appx:///" + filepath;
var uri = new Windows.Foundation.Uri(p);
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri)
   .then(function (sampleFile) {
       return Windows.Storage.FileIO.readTextAsync(sampleFile);
   }).done(function (filedata) {
         document.getElementById("t").innerHTML = filedata;
        // want to return filedata to get_ver()
   }
   );
 }

我想访问从get_ver()内的"verfile"(即变量filedata的值)读取的数据,该数据可以作为返回值。如何做到这一点?

我不希望将值设置为元素的innerHTML,而是希望将其返回给调用者,以便对其进行进一步处理。

因为get_text方法正在调用异步API来完成它的工作,所以它也变成了异步API。要从中返回一个值,则需要返回该值的promise。最简单的方法是从链中最后一个然后返回promise,然后从最内部的已完成处理程序返回最终值。

也就是说,这样写你的方法:

function get_text(filepath) {
    var p = "ms-appx:///" + filepath;
    var uri = new Windows.Foundation.Uri(p);
    return Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri)
        .then(function (sampleFile) {
            return Windows.Storage.FileIO.readTextAsync(sampleFile);
        }).then(function (filedata) {
            document.getElementById("t").innerHTML = filedata;
            return filedata;
        });
 }

请注意,我将"done"改为"then",这样我们就可以从链中获得另一个承诺。我在最里面的已完成处理程序中插入了一个return filedata,并在第一个异步调用之前插入了一条return语句。这样做的目的是从整个链返回一个promise,而该promise的实现值(根据then的定义)是最后完成的处理程序的返回值。(如果你想对此有更多的解释,我的书的第二版预览,http://aka.ms/brockschmidtbook2)有一个完整的附录,叫做"揭开承诺的神秘面纱"

因为get_ver现在收到了一个promise,所以您只需向该promise添加一个已完成的处理程序(使用done now,因为您处于链的末尾):

function get_ver(){
     get_text("verfile").done(function (filedata) {
         // Use filedata
     });
}

这有道理吗?这是从本身使用异步API的函数返回值的通用模式,这使得这些函数也是异步的。

Kraig