我创建了“小”服务器,它使用NodeJs并承诺从给定目录中复制和压缩给定类型的文件。它必须是separeted,每个都在承诺 - 阅读文件并打包它们。首先,我创建了那些承诺,以检查它们是否有效,并且他们做了:
function packFile(file){
var fileName = path.basename(file);
console.log(' (+) Add to the archive : ' + fileName + ' ['+file+']');
archive.append(fs.createReadStream(file), { name:fileName });
}
Q.nfcall(recursive, pathGiven, filterGiven)
.then(function(data) {
var chain = Q.when();
for(var i = 0; i < data.length; i++){
console.log(' > '+data[i]+' > adding to chain ...');
chain = chain.then(packFile.bind(this, data[i]));
}
chain.then(function() {
archive.finalize();
});
Ofc,我补充说,在前面提到的代码前面:
fs = require('fs');
archiver = require('archiver');
Q = require('q');
recursive = require('recursive-readdir');
path = require('path');
所有这些都是安全的,工作正常。 “存档”也在开始时正确初始化。
由于所有工作 - 现在是时候开始使用服务器了:
//Lets require/import the HTTP module
var http = require('http');
//Lets define a port we want to listen to
const PORT=8080;
//Create a server
var server = http.createServer(handleRequest);
//Lets start our server
server.listen(PORT, function(){
console.log("Server listening on: http://localhost:%s", PORT);
});
函数“handleRequest”非常大,所以为了得到它的要点,我将把部分放在哪里处理这些承诺:
switch(request.url) {
case '/formhandler':
if (request.method == 'POST') {
// (...) Got my "Sour" (Path to source directory ) and "Mask"
// Here i tried to place that promise chain, but server just skipped it and continued
Q.nfcall(recursive, Sour, Mask)
.then(function(data) {
var chain = Q.when();
for(var i = 0; i < data.length; i++){
console.log(' > '+data[i]+' > adding to chain ...');
chain = chain.then(packFile.bind(this, data[i]));
}
chain.then(function() {
console.log("whole chain resolved");
console.log('FINISHING');
archive.finalize();
});
});
// (...) Finishing this request
}
break;
}
我所做的一切似乎都无法奏效。只要我使用这些承诺(称之为或某些功能)。我不明白为什么。
编辑1 我的意思是跳过 - 我在该处理程序中的promises之前和之后放置了2个console.log。我看到了:
LOG1
TEXT_FROM_PROMISES //Something those promises send to console.log
LOG2
但只有:
LOG1
LOG2
服务器已准备好接受另一个请求。
编辑2 一些人建议在评论中更改packFile以便它会返回promise,所以我做了:
function packFile(file){
return new Promise(function(resolve,reject){
var fileName = path.basename(file);
console.log(' (+) Adding to the archive : ' + fileName + ' ['+file+']');
archive.append(fs.createReadStream(file), { name:fileName });
});
}
其余代码不变。结果是 - 现在只有来自这个链的第一个(如果我在脚本中单独称它为“没有服务器”)它仍然无法在服务器上运行。
编辑3
我再次改变了'packFile':
function packFile(file){
return new Promise(function(resolve,reject){
var fileName = path.basename(file);
console.log(' (+) Adding to the archive : ' + fileName + ' ['+file+']');
archive.append(fs.createReadStream(file), { name:fileName });
resolve("Success!");
});
}
不是整个链都可以工作 - 对于无服务器版本,但仍然 - 服务器上没有任何事情发生。
编辑4 我改变了
Q.nfcall(recursive, pathGiven, filterGiven)
.then(function(data) {
var chain = Q.when();
for(var i = 0; i < data.length; i++){
console.log(' > '+data[i]+' > adding to chain ...');
chain = chain.then(packFile.bind(this, data[i]));
}
chain.then(function() {
console.log("whole chain resolved");
archive.finalize();
});
}, function(reason) {
console.log("ERROR:"+reason); // Error!
});
并在控制台中出现了一些新错误:
ERROR:TypeError: ignores.map is not a function
编辑5 代码我用于存档,只是为了制作和打开.zip来添加文件到我的'packFile'
archive = archiver.create('zip', {});
var output = fs.createWriteStream('./output.zip');
archive.pipe(output);
编辑6 由于似乎需要更多代码,tehre是我在服务器上调用的功能,只要我收到正确的请求( - &gt;检查此帖子的开头)
function handleWithPromises(pathGiven, filterGiven){
console.log(' > Promising ...');
archive = archiver.create('zip', {});
var output = fs.createWriteStream('./output.zip');
archive.pipe(output);
function packFile(file){
return new Promise(function(resolve,reject){
var fileName = path.basename(file);
console.log(' (+) Adding to the archive : ' + fileName + ' ['+file+']');
archive.append(fs.createReadStream(file), { name:fileName });
resolve("Success!");
});
}
Q.nfcall(recursive, pathGiven, filterGiven)
.then(function(data) {
var chain = Q.when();
for(var i = 0; i < data.length; i++){
console.log(' > '+data[i]+' > adding to chain ...');
chain = chain.then(packFile.bind(this, data[i]));
}
chain.then(function() {
console.log('FINISHING');
archive.finalize();
});
});
}
和代码放在脚本的最前面:
fs = require('fs');
archiver = require('archiver');
Q = require('q');
recursive = require('recursive-readdir');
path = require('path');
答案 0 :(得分:1)
返回编辑1 您希望看到的地方
LOG1
TEXT_FROM_PROMISES //Something those promises send to console.log
LOG2
但得到了
LOG1
LOG2
解释是,在调用then
的线程执行完成之后,A + compliance promises与事件循环调度程序接口,以在自己的线程中执行then
提供的函数。
链接的promises与定义它们的代码异步执行。
在一个非常简单的层面上,您需要推迟结束请求,直到所有文件都已打包为止,确保response
在最后一个匿名函数的函数范围内,并在那里结束响应:
chain.then(function() {
console.log('FINISHING');
archive.finalize();
response.write(...) // are you sending the archive back?
response.end(); // now end the request
});