2013-07-19 54 views
0

我写了下面的代码[Windows Store JavaScript App]:获得价值:Windows应用商店的应用程序的JavaScript

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() 
    } 
    ); 
} 

我要访问从“verfile” [即读取数据get_ver()中的变量filedata的值可以作为返回值。如何做?

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

+0

你想要哪个值? –

+0

'filedata'的值,即从文件中读取。 – TheCrazyProgrammer

回答

0

因为你的get_text方法正在调用一个异步API来完成它的工作,所以它也变成了一个异步API。为了从中返回一个值,那么,你需要为该值返回一个承诺。最简单的方法是将最后的然后的承诺返回到链中,并从最内层完成的处理程序返回最终值。

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

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; 
     }); 
} 

注意,我改变了“做”到“然后”,所以我们得到另一个承诺从链回来。我在最里面的完成处理程序中插入了一个return filedata,并在第一个异步调用之前插入了一个return语句。它所做的是从整个链中返回一个承诺,并且该承诺的履行价值(根据当时的定义)是最后完成的处理程序的返回值。 (如果你想要更多的解释,我的书第二版预览,http://aka.ms/brockschmidtbook2)有一个名为“揭秘诺言”的整个​​附录。

因为get_ver现在收到一个承诺回来,你只需要添加一个完整的处理程序,这个承诺(使用现在完成了,因为你是在链的末端):

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

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

。克雷格

+0

非常感谢!这对我有用,是的,我必须说好的解释。我是完全新手的异步的东西,你的解释让我真正了解它。 – TheCrazyProgrammer

+1

是的,这对我们很多人来说都是新的。我终于坐下来拣选了承诺的细节(请参阅http://blogs.msdn.com/b/windowsappdev/archive/2013/06/11/all-about-promises-for-windows-store-apps-written -in-javascript.aspx),那么事情就不那么神秘了! –

相关问题