尝试将zlib deflate包装到异步等待中

Chr*_*ams 2 javascript async-await

我正在尝试重构一些代码以删除.then pyramid,我需要一些帮助。

我正在尝试压缩JSON正文以传递给fetch调用。我实际上已经对此进行了管理,并通过zlib回调调用了fetch,但是代码变得混乱了。

因此,我一直在考虑将zlib调用包装在异步等待包装器中。例如

async function syncCompressBody(body) {

  //return await compressBody(body);
  const compressedData = await compressBody(body);
  console.log("compressedData");
  console.log(compressedData);
  return compressedData;

}

function compressBody(body) {

  return new Promise( function( resolve, reject ) {

    zlib.deflate(body, (err, buffer) => {
      if(err){
        console.log("Error Zipping");
        reject(err);
      }
      console.log("Zipped");

      resolve(buffer);
    });
  });

}
Run Code Online (Sandbox Code Playgroud)

compressBody函数返回一个Promise。拒绝和解决调用位于zlib.deflate的回调中。

我实际上用JSON调用syncCompressBody进行压缩。返回的值是来自compressBody的resolve调用的结果。

这两个函数在帮助程序库中。在我的网页中,作为提交操作的一部分,我有...

  console.log(jsonContent);
  const compressedBody = syncCompressBody(jsonContent);
  console.log(compressedBody);

  console.log("should be zipped by now..." + compressedBody);
Run Code Online (Sandbox Code Playgroud)

但是,在compressBody函数中看到的“已压缩”消息之前会显示“应压缩”消息。我真正想要的是让代码在syncCompressBody中等待,然后在提交操作中返回并恢复JS。

编辑以下反馈...。

基于Bergi和Liam的评论,我提出了这个示例,其中几个函数都依赖于先前的函数。

function awaitStyle2x(){
    console.log("pre-awaitStyle2 start");  
    (async () => {
      console.log("awaitStyle2 start")        
      const t = await theFirstAsyncFunctionX("pass it on");
      const u = await theNextAsyncFunctionX(t);
      const v = await aThirdAsyncFunctionX(u);
        console.log("awaitStyle2 finshed - " + v)
    })().catch(e => { /* handle the error */});   
    console.log("post-awaitStyle2 finished") ; 
}
Run Code Online (Sandbox Code Playgroud)

先显示预注释,然后显示awaitStyle2,然后显示函数FirstAsyncFunctionX中的控制台日志消息,然后显示后消息。

现在我可以看到为什么我的代码具有竞争条件,我走对了吗?

And*_*rew 6

我有一个类似的用例gzip,请告知是否有帮助:

const util = require('util');
const zlib = require('zlib');
const deflate = util.promisify(zlib.deflate);

console.log(jsonContent);
const compressedBody = await deflate(jsonContent);
console.log(compressedBody);

console.log("should be zipped by now..." + compressedBody);
Run Code Online (Sandbox Code Playgroud)