我是Promises和WinJS的新手,我正在开发一款应用。
在某些时候,我需要使用backgroundDownloader下载文件并将其保存在本地文件夹中,然后读取并处理数据。
有一个函数启动这个过程,我想在继续之前等待整个过程的完成。然而,通过一些调试,我意识到在第一个承诺成功返回后,程序继续进行,而不应该(我认为)。我相信它应该等待所有的承诺一个接一个地成功返回。
以下是代码:
启动流程的功能:
function startDownload(){ getData.done(function(){ 等等等等等等 } }
上面函数调用的getData函数:
getData: function () {
return downloadFtp(staticUrl, filePath)
.then(function (response) {
var data = openFile(response.resultFile.name);
return data;
});
}
downloadFtp函数,用于下载和保存内容并返回一个承诺
downloadFtp: function (uriString, fileName) {
var download = null;
try {
// Asynchronously create the file in the pictures folder.
return Windows.Storage.ApplicationData.current.localFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.replaceExisting)
.then(function (newFile) {
var uri = Windows.Foundation.Uri(uriString);
var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
// Create a new download operation.
download = downloader.createDownload(uri, newFile);
// Start the download and persist the promise to be able to cancel the download.
return download.startAsync();
});
} catch (err) {
displayException();
}
},
openFile函数,它打开本地文件并返回一个promise:
openFile: function (file) {
return Windows.Storage.ApplicationData.current.localFolder.getFileAsync(file)
.then(function (content) {
var content = readFile(content);
return content;
});
},
readFile函数,用于读取文件中的数据并将其发送到数据处理器:
readFile: function (content) {
return Windows.Storage.FileIO.readTextAsync(content)
.done(function (timestamp) {
var text = processData(timestamp);
return text;
});
},
在startDownload函数中,我注意到它在进入done()函数之前不会等待整个过程的完成。是否有一个简单的解决方法,或通常使用嵌套承诺的简单方法?
我很感激这里的任何帮助。
答案 0 :(得分:0)
我要将您的样本转为伪代码,以便更容易发现问题。
downloadFtp.then(getFileAsync.then(readTextAsync.done(processData)))
.done(BLAH)
问题是正在解析的downloadFile会触发两个回调,即getFileAsync和BLAH。 getFileAsync回调返回一个可能在此状态下未解析的promise,但回调仍然立即结束,因此BLAH可以自由运行。稍后将解析getFileAsync并调用其他回调。
您可以做的最好的事情是切换到promises的链接模型,从而更容易控制执行流程。