从angular2的API响应中解压缩或解压缩数据

时间:2018-07-06 14:20:37

标签: node.js angular typescript

我正在使用解压缩功能来解压缩打字稿(angular2)中来自API的压缩响应。

customers:any=[];
zlib.gunzip(Buffer.from(response), function(err, uncompressedMessage) 
{
  if(err) 
  {
    console.log(err);
  }
  else 
  {
    resultArray = JSON.parse(uncompressedMessage.toString());
    consloe('response After Unzip within fun',resultArray);        
    this.customers = resultArray; // error undefined
  }
});
console('response After Unzip outside fun',resultArray); // undefined

在这里,resultArray仅可在函数内部访问,而不能在外部访问。我尝试声明全局变量并对其进行访问,但无法访问该值。因此,建议我如何实现此目标。

1 个答案:

答案 0 :(得分:0)

问题是function(err, uncompressedMessage) {}是异步的。而且您正在尝试设置resultArray之前对其进行访问。

您可以做的是将解压缩功能包装在一个返回Promise的函数中,如下所示:

let uncompress = (response) => new Promise((resolve, reject) => {
    zlib.gunzip(Buffer.from(response), function(err, uncompressedMessage) {
        if(err) {
            reject(err);
        } else {
            let resultArray = JSON.parse(uncompressedMessage.toString());        
            resolve(resultArray);
        }
    });
});

完成后,当您收到回复时,您可以使用:

const customers = await uncompress(response); // not undefined anymore

请注意,使用await关键字的方法必须声明为async。如果您不想这样做,则可以这样使用普通的Promise

uncompress(response).then(function(customers){ /* logic */ })

别忘了使用bind(this)这样回调

uncompress(response).then(function(customers){ /* logic */ }.bind(this))