繁体   English   中英

在Node.JS中使用Bluebird承诺

[英]Using Bluebird Promises in Node.JS

在我的应用程序中,我试图读取一个文件,然后将该文件的内容写入另一个文件。

我已经使用了蓝鸟承诺来做到这一点。 我需要帮助以确认我对使用诺言的理解是正确的。

我的问题是

  1. 在我的示例中,我首先读取文件,然后在文件读取文件后,将内容写入下一个“ .then”块中的另一个文件。 将内容写入文件后,我需要记录一条消息。 我已将其包含在第二个“ .then”块中。 我需要知道我对诺言的理解是否正确。 第二个.then块将用作writefile语句的回调函数吗?

  2. 我需要写更有意义的日志消息。 如果在读取文件和写入文件时发生错误,则会显示不同的错误消息。 我该如何使用挡块?

提前致谢!

代码示例如下。

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));
var logger = require("./logger.js")
var projectJSON = require("../project.json");

var harPath = projectJSON.project.harfile.location;
var harFileNames = projectJSON.project.transactions.transactionsName;
var harFilePath;
var harFiles = {};
var writeFilePath = "../temp/"


harFileNames.forEach(function(harFileName){
    harFilePath = harPath + "/" + harFileName + ".har";

    fs.readFileAsync(harFilePath, "utf-8")
        .then(function(data){
            fs.writeFile(writeFilePath + harFileName + ".json", data);
            test = data;

        })
        .then(function(){
            console.log("data written successfully: ");

        })
        .catch(function(err){
            logger.error("error", "Error reading har files from location!");

        });

});

如果要分别捕获每个错误,则可以在每个操作之后立即放置一个错误处理程序,以便直接捕获该特定错误。

然后,要传播错误,您可以重新抛出错误值。

然后,您想切换到fs.writeFileAsync()以便所有内容都是异步的并且正在使用fs.writeFileAsync()

然后,您需要从fs.writeFileAsync()返回承诺。

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));
var logger = require("./logger.js")
var projectJSON = require("../project.json");

var harPath = projectJSON.project.harfile.location;
var harFileNames = projectJSON.project.transactions.transactionsName;
var harFilePath;
var harFiles = {};
var writeFilePath = "../temp/"


harFileNames.forEach(function(harFileName){
    harFilePath = harPath + "/" + harFileName + ".har";

    fs.readFileAsync(harFilePath, "utf-8")
        .then(function(data){
            harFiles[JSON.parse(data).log.pages[0].id] = JSON.parse(data);
            return data;
        }).catch(err) {
            logger.error("error", "Error reading har files from location!");
            throw err;      // propagate error
        }).then(function(data){
            return fs.writeFile(writeFilePath + harFileName + ".json", data).catch(function(err) {
                logger.error("error", "Error writing to harFile!");
                throw err;   // propagate error
            });
        }).then(function(){
            console.log("data written successfully: ");
        }).catch(function(err){
            // either one of the errors
        });

});

请记住,当您使用.catch()处理函数时,该错误将被视为“已处理”,并且所产生的承诺将得到实现,而不是被拒绝。 因此,如果您想捕获特定位置的错误(因此您确切知道错误的出处),但又希望结果承诺仍被拒绝,则可以返回被拒绝的承诺或重新抛出相同的错误。


对于有关如何返回harFiles其他问题,您将需要一个周围的承诺,当一切完成后,可以使用harFiles解决该承诺。 蓝鸟的Promise.map()对此很有用,因为它将为您进行迭代并返回主承诺。 这部分代码看起来像这样:

function someFunc() {

    var harPath = projectJSON.project.harfile.location;
    var harFileNames = projectJSON.project.transactions.transactionsName;
    var harFilePath;
    var harFiles = {};
    var writeFilePath = "../temp/"

    return Promise.map(harFileNames, function(harFileName) {
        harFilePath = harPath + "/" + harFileName + ".har";

        return fs.readFileAsync(harFilePath, "utf-8")
            .then(function(data){
                harFiles[JSON.parse(data).log.pages[0].id] = JSON.parse(data);
                return data;
            }, function(err) {
                logger.error("error", "Error reading har files from location!");
                throw err;      // propagate error
            }).then(function(data){
                return fs.writeFile(writeFilePath + harFileName + ".json", data).catch(function(err) {
                    logger.error("error", "Error writing to harFile!");
                    throw err;   // propagate error
                });
            }).then(function(){
                console.log("data written successfully: ");
            }).catch(function(err){
                // either one of the errors
            });

    }).then(function() {
        // all results are in harFiles array here
        return harFiles;
    });
}

someFunc().then(function(hFiles) {
    // hFiles should be your files object
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM