0

我编写了以下代码 [ 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,而是希望它应该返回给调用者,以便可以进一步处理它。

4

1 回答 1

0

因为您的 get_text 方法正在调用异步 API 来完成其工作,所以它也变成了异步 API。那么,要从中返回一个值,您需要为该值返回一个承诺。最简单的方法是从链中的最后一个then返回 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;
        });
 }

请注意,我将“完成”更改为“然后”,因此我们从链中获得了另一个承诺。我在最里面的完整处理程序中插入了一个返回文件数据,并在第一个异步调用之前插入了一个返回语句。它的作用是从整个链中返回一个 Promise,并且该 Promise 的实现值(根据 then 的定义)是最后一个完成的处理程序的返回值。(如果您想对此进行更多解释,请参阅我的书的第二版预览,http://aka.ms/brockschmidtbook2)有一个完整的附录,称为“揭秘承诺”。

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

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

那有意义吗?这是从本身使用异步 API 的函数返回值的一般模式,这使得这些函数也异步。

.克雷格

于 2013-07-19T15:31:47.747 回答