2017-06-08 49 views
-1

我对我的承诺如何在我的node.js Web应用程序中工作面临一些困惑。承诺在我的节点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转换为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])的输出。这是我感到困惑的部分,为什么我的代码的行为如此。我也张贴了我的剧本,我的承诺使用,供您参考:

文档转换器SCRIPT:

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

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

+0

您需要在'convert'函数中加入'new Promise'调用 – Bergi

回答

1

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

您需要做的就是使convert()函数返回一个Promise,它解决或拒绝您传递给.write()方法的回调。

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

而且,因为它代表你的编码器是不是异步的,所以没有意义了Promise加以包装。
虽然可以使它异步,例如通过使用.readdir()而不是.readdirSync()。如果你这样做,我解释的关于你的转换器的相同的东西适用于你的编码器。

+0

非常感谢!这很有帮助! – Vmal

相关问题