在 Node.JS 中使用 Bluebird Promises
Using Bluebird Promises in Node.JS
在我的应用程序中,我试图读取一个文件,然后将文件的内容写入另一个文件。
我已经使用 bluebird promises 来做到这一点。我需要帮助来确认我对使用承诺的理解在我的实现中是正确的。
我的问题是,
在我的示例中,我首先读取文件,然后在文件读取文件后,我将内容写入下一个“.then”块中的另一个文件。将内容写入文件后,我需要记录一条消息。我已将其包含在第二个“.then”块中。我需要知道我对承诺的理解是否正确。第二个'.then'块会作为writefile语句的回调函数吗?
我需要写更有意义的日志信息。如果在读取文件和写入文件时发生错误,则会显示不同的错误消息。我如何使用 catch 块执行此操作?
提前致谢!
代码示例如下。
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()
这样一切都是异步的并且正在使用 promises。
然后,你需要return来自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()
处理程序时,错误将被视为 "handled" 并且结果承诺将得到履行,而不是被拒绝。所以,如果你想捕获特定位置的错误(这样你就知道它的确切来源),但你希望得到的承诺仍然被拒绝,那么你可以 return 一个被拒绝的承诺或重新抛出相同的承诺错误。
根据您关于如何 return harFiles
的附加问题,您将需要一个周围的承诺,当一切都完成时,该承诺将通过 harFiles
解决。 Bluebird 的 Promise.map()
对此很有用,因为它既会为您进行迭代,又会 return 一个主要承诺。这部分代码的外观如下:
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
});
在我的应用程序中,我试图读取一个文件,然后将文件的内容写入另一个文件。
我已经使用 bluebird promises 来做到这一点。我需要帮助来确认我对使用承诺的理解在我的实现中是正确的。
我的问题是,
在我的示例中,我首先读取文件,然后在文件读取文件后,我将内容写入下一个“.then”块中的另一个文件。将内容写入文件后,我需要记录一条消息。我已将其包含在第二个“.then”块中。我需要知道我对承诺的理解是否正确。第二个'.then'块会作为writefile语句的回调函数吗?
我需要写更有意义的日志信息。如果在读取文件和写入文件时发生错误,则会显示不同的错误消息。我如何使用 catch 块执行此操作?
提前致谢!
代码示例如下。
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()
这样一切都是异步的并且正在使用 promises。
然后,你需要return来自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()
处理程序时,错误将被视为 "handled" 并且结果承诺将得到履行,而不是被拒绝。所以,如果你想捕获特定位置的错误(这样你就知道它的确切来源),但你希望得到的承诺仍然被拒绝,那么你可以 return 一个被拒绝的承诺或重新抛出相同的承诺错误。
根据您关于如何 return harFiles
的附加问题,您将需要一个周围的承诺,当一切都完成时,该承诺将通过 harFiles
解决。 Bluebird 的 Promise.map()
对此很有用,因为它既会为您进行迭代,又会 return 一个主要承诺。这部分代码的外观如下:
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
});