Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WinJS中的嵌套承诺以及如何等待最终完成_Javascript_Background_Nested_Winjs_Promise - Fatal编程技术网

Javascript WinJS中的嵌套承诺以及如何等待最终完成

Javascript WinJS中的嵌套承诺以及如何等待最终完成,javascript,background,nested,winjs,promise,Javascript,Background,Nested,Winjs,Promise,我是promises和WinJS的新手,目前正在开发一个应用程序 在某个时候,我需要使用backgroundDownloader下载一个文件并将其保存在本地文件夹中,然后读取它并处理数据 有一个函数启动这个过程,我想在继续之前等待整个过程的完成。然而,通过一些调试,我意识到在第一个承诺成功返回后,程序继续进行,而它不应该(我认为)。我认为应该等待所有的承诺一个接一个地成功回归 代码如下: 启动流程的功能: 函数startDownload(){ getData.done(函数(){ 废话废话 }

我是promises和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()函数之前不会等待整个过程的完成。有没有简单的解决方法,或者简单的方法来处理嵌套承诺


我将非常感谢您的帮助。

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

downloadFtp.then(getFileAsync.then(readTextAsync.done(processData)))
           .done(BLAH)
问题是,正在解析的downloadFile会触发两个回调,getFileAsync和BLAH。getFileAsync回调返回一个承诺,该承诺在此状态下可能无法解析,但回调仍会立即结束,因此BLAH可以自由运行。稍后会解析getFileAsync并调用其他回调


您可以做的最好的事情是切换到承诺的链接模型,以便更容易地控制执行流。

在等待回答时,我将“完成(processData)”中的“完成”关键字更改为“然后”,一切似乎都恢复了正常。我不太明白这是怎么解决的。你的回答也有道理。谢谢。我会尝试更改代码以反映你的建议。