承诺在我的Node JS应用程序

时间:2017-06-08 14:39:01

标签: javascript node.js promise

我对如何在我的node.js网络应用程序中使用我的承诺感到困惑。

  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;
            }
};

如果我能得到一些关于为什么会发生这种情况的建议以及我可以对我的代码做出的任何更改,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题出在您的文档转换器脚本中。您将回调函数传递给.write()方法。换句话说,它是异步的,但您的convert()函数会同步返回。您可以立即返回check,然后在回调中将其设置为false。

您需要做的是让convert()函数返回Promise,该.write()会在您传递给conv()方法的回调中解析或拒绝。

然后在您的应用程序脚本中,您的let conv = () => converter.convert(req);函数声明可以简化为:Promise

另外,由于您的编码器不是异步的,因此将它包裹在.readdir()中是没有意义的。
您可以将其设为异步,例如使用.readdirSync()代替{{1}}。如果你这样做,我解释的转换器的相同内容适用于你的编码器。