【问题标题】:Trying to wrap zlib deflate into async await试图将 zlib deflate 包装成异步等待
【发布时间】:2018-02-28 10:59:13
【问题描述】:

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

我正在尝试压缩 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);
    });
  });

}

compressBody 函数返回一个承诺。 reject 和 resolve 调用在 zlib.deflate 的回调中。

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

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

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

  console.log("should be zipped by now..." + compressedBody);

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

根据反馈进行编辑......

基于 Bergi 和 Liam 的 cmets,我想出了几个等待的示例,每个函数都依赖于前一个函数....

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

先显示前注释,然后启动 awaitStyle2,然后是函数 theFirstAsyncFunctionX 中的控制台日志消息,然后是后消息。

我现在可以看到为什么我的代码有竞争条件,我是否走在正确的轨道上?

【问题讨论】:

  • async function sync… 说不通,不是吗?
  • compressedBody = await syncCompressBody(jsonContent);
  • "我实际上调用了syncCompressBody,返回值就是结果" - 不。 async function 的返回值是一个承诺。这才有意义,因为您不能使 zlib 同步。你还需要等待。
  • 如果您不等待,您将无法获得结果。如果你不能使用 await 你需要处理产生的 promise 或者不等待结果

标签: javascript async-await


【解决方案1】:

我有一个与 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);

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2020-10-04
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多