0

我是 Promise 和 WinJS 的新手,目前正在开发一个应用程序。

在某些时候,我需要使用 backgroundDownloader 下载文件并将其保存在本地文件夹中,然后读取并处理数据。

有一个函数可以启动这个过程,我想等待整个过程完成后再继续。然而,通过一些调试,我意识到在第一个承诺成功返回后,程序会继续进行,而它不应该这样做(我认为)。我相信它应该等待所有的承诺一个接一个地成功返回。

这是代码:

启动该过程的函数:

函数 startDownload() { getData.done( 函数 () { 等等等等 } }

上述函数调用的 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 函数打开本地文件并返回一个承诺:

    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() 函数之前不会等待整个过程完成。是否有一个简单的解决方法,或者一般来说使用嵌套承诺的简单方法?

我会很感激这里的任何帮助。

4

1 回答 1

0

我会将您的示例转换为伪代码,以便更容易发现问题。

downloadFtp.then(getFileAsync.then(readTextAsync.done(processData)))
           .done(BLAH)

问题是正在解析的 downloadFile 会触发两个回调,getFileAsync 和 BLAH。getFileAsync 回调返回一个在此状态下可能未解决的承诺,但回调仍会立即结束,因此 BLAH 可以自由运行。稍后解决 getFileAsync 并调用其他回调。

您可以做的最好的事情是切换到 Promise 的链接模型,从而更容易控制执行流程。

于 2013-08-23T09:03:17.803 回答