Javascript 承诺在my Node JS应用程序中无法按预期工作
关于我的承诺在node.js web应用程序中如何工作,我面临着一些困惑Javascript 承诺在my Node JS应用程序中无法按预期工作,javascript,node.js,promise,Javascript,Node.js,Promise,关于我的承诺在node.js web应用程序中如何工作,我面临着一些困惑 let arrayPics = []; let conv = ()=>{ return new Promise((resolve,reject)=>{ let check=converter.convert(req); if(check) resolve('Conv
let arrayPics = [];
let conv = ()=>{
return new Promise((resolve,reject)=>{
let check=converter.convert(req);
if(check)
resolve('Conversion');
else
reject();
});
};
let enc = (message)=>{
return new Promise((resolve,reject)=>{
let check = encode.encoder(arrayPics);
if(check)
resolve(message + ' and Encoding to Base 64!');
else
reject();
});
};
conv().then((result)=>{
return enc(result);
}).then((result)=>{
console.log('Finished '+result);
console.log(arrayPics[4]);
return res.redirect('/ViewDoc');
});
因此,基本上我的第一个承诺是运行一个脚本,将pdf和tiff文件文档转换为临时文件夹中的单独png文件。然后,第二个promise运行一个脚本,将png转换为base 64,并将其存储在动态数组中。当我使用承诺时,我得到如下输出:
{ title: '' }
{ fieldname: 'upl',
originalname: 'multipage_tiff_example.tif',
encoding: '7bit',
mimetype: 'image/tiff',
destination: 'uploads/',
filename: 'multipage_tiff_example.tif',
path: 'uploads\\multipage_tiff_example.tif',
size: 810405 }
Finished Conversion and Encoding to Base 64!
undefined
POST / 302 181.742 ms - 60
GET /ViewDoc 304 8.564 ms - -
Converted!
我们可以看到console.log(arrayPics[4])输出是未定义的。但是,当我在调试代码时运行相同的代码时,我会得到以下输出
Debugger listening on [::]:54395
Server is listening on: 3000
GET / 304 35.525 ms - -
{ title: '' }
{ fieldname: 'upl',
originalname: 'multipage_tiff_example.tif',
encoding: '7bit',
mimetype: 'image/tiff',
destination: 'uploads/',
filename: 'multipage_tiff_example.tif',
path: 'uploads\\multipage_tiff_example.tif',
size: 810405 }
Finished Conversion and Encoding to Base 64!
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABGdBTUEAAL.......
Converted!
我们可以看到,现在我们得到了console.log(arrayPics[4])的输出。这是我感到困惑的部分,我的代码为什么会这样。我还发布了我的脚本,供您参考:
文档转换器脚本:
module.exports = {
convert: function pdfConverter(req)
{ let check = true;
gm(req.file.path).write('Images/output.png', (err)=>
{
if(err)
{
console.log(err);
reject(err);
check = false;
}
else
{
console.log("Converted!");
}
});
return check;
}
};
BASE64编码
module.exports = {
encoder: function base64_encoder(arrayPics)
{
let files = fs.readdirSync('Images/');
for(let i in files)
{
//console.log('C');
arrayPics.push(base64Img.base64Sync('Images/output-' + i + ".png"));
}
return true;
}
};
如果我能得到一些关于为什么会发生这种情况以及我可以对代码进行的任何更改的建议,我将不胜感激 问题出在文档转换器脚本中。将回调函数传递给
.write()
方法。换句话说,它是异步的,但是您的convert()
函数会同步返回。在回调中可能设置为false之前,立即返回check
您需要做的是使convert()
函数返回一个Promise
,该函数在传递给.write()
方法的回调中解析或拒绝
然后在应用程序脚本中,您的conv()
函数声明可以简化为:let conv=()=>converter.convert(req)代码>
此外,目前您的编码器不是异步的,因此没有必要将其包装为承诺
不过,您可以将其设置为异步,例如使用.readdir()
而不是.readdirSync()
。如果您这样做,我解释的关于转换器的相同内容也适用于编码器。您需要将新承诺
调用放在转换
函数中。非常感谢!那很有帮助!