在节点中按特定顺序调用模块
Call to modules in specific order in node
我使用了下面的代码来调用两个模块,但是调用操作是在验证文件之前调用的(我在调试中看到的)。我该怎么验证validateFile
在appHandler.invokeAction
之前呢?我应该用承诺吗?
var validator = require('../uti/valid').validateFile();
var appHandler = require('../contr/Handler');
appHandler.invokeAction(req, res);
更新这是验证文件代码
var called = false;
var glob = require('glob'),
fs = require('fs');
module.exports = {
validateFile: function () {
glob("myfolder/*.json", function (err, files) {
var stack = [];
files.forEach(function (file) {
fs.readFile(file, 'utf8', function (err, data) { // Read each file
if (err) {
console.log("cannot read the file", err);
}
var obj = JSON.parse(data);
obj.action.forEach(function (crud) {
for (var k in crud) {
if (_inArray(crud[k].path, stack)) {
console.log("duplicate founded!" + crud[k].path);
break;
}
stack.push(crud[k].path);
}
})
});
});
});
}
};
因为glob
和fs.readFile
是异步函数和appHandler。
Promise是解决这个问题的一个很好的解决方案,但是老式的回调也可以完成这个工作。
validator.validateFile().then(function() {
appHandler.invokeAction(req, res);
});
and for validate
var Promise = require("bluebird"), // not required if you are using iojs or running node with `--harmony`
glob = require('mz/glob'),
fs = require('mz/fs');
module.exports = {
validateFile: function () {
return glob("myfolder/*.json").then(function(files) {
return Promise.all(files.map(function(file) {
// will return an array of promises, if any of them
// is rejected, validateFile promise will be rejected
return fs.readFile(file).then(function (content) {
// throw new Error(''); if content is not valid
});
}));
})
}
};
如果你想使用承诺mz可以帮助:)
由于fs.fileRead
是async
,您应该将想要在validateFile
之后执行的代码放入callback
。
原点可以是:
var validator = require('../uti/valid').validateFile();
var appHandler = require('../contr/Handler');
// create a new function that when execute, will call appHandler.invokeAction with req and res given to its arguments.
validator.validateFile(appHandler.invokeAction.bind(null, req, res));
验证器部分应该是:
var called = false;
var glob = require('glob'),
fs = require('fs');
module.exports = {
validateFile: function (callback) {
glob("myfolder/*.json", function (err, files) {
var stack = [];
// Use it to decide whether all files processed or not.
var filesToLoad = files.length;
files.forEach(function (file) {
fs.readFile(file, 'utf8', function (err, data) { // Read each file
--filesToLoad;
if (err) {
console.log("cannot read the file", err);
// If the invoke action doesn't depend on the result. You may want to call it here too.
}
var obj = JSON.parse(data);
obj.action.forEach(function (crud) {
for (var k in crud) {
if (_inArray(crud[k].path, stack)) {
console.log("duplicate founded!" + crud[k].path);
break;
}
stack.push(crud[k].path);
}
})
// Only called the callback after all files processed.
if (filesToLoad === 0) {
callback();
}
});
});
});
}
};
编辑:感谢Bergi的提醒,文件是一个数组,当所有文件都被处理时,你必须调用回调,所以我们必须进一步使用一个变量来决定有多少文件尚未处理。
相关文章:
- 从公共方法调用模块的私有函数
- 如何按顺序调用延迟函数
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 无法调用模块's函数
- 按顺序调用javascript代码的替代方法,其间有延迟
- 当列表长度未知时按顺序调用 http.get
- 访问调用模块中定义的所需模块中的函数
- JavaScript函数按顺序调用,由JSP进行
- 我想返回一个函数并在调用模块中对其进行评估
- 如何按顺序调用多个异步 JavaScript 函数
- 函数的 JS 顺序调用失败
- 按顺序调用 Javascript 函数
- 如何按顺序调用一堆包含 ajax 的函数
- 单个画布元素按顺序调用多个函数
- 如何在可以按各种顺序调用的函数中使用 promise
- 如何将回调顺序调用设置为与目标函数调用相同
- jQuery Deferred对象,按顺序调用函数
- 如何正确地按顺序调用异步函数列表
- 如何从一个完全独立的模块控制器中调用模块的控制器函数?
- 在节点中按特定顺序调用模块