使用greenlet解析web worker中的响应对象

时间:2018-02-23 04:05:35

标签: javascript json response worker

greenlet是一个将异步函数移动到自己的线程中的库。

import greenlet from 'greenlet'

let get = greenlet(async url => {
    // This will run in worker
    let res = await fetch(url)
    return await res.json()
})

console.log(await get('/foo'));

我听说如果我获取主线程并解析工作者,性能将非常好。所以我尝试了类似

的东西
let parseInWorker = greenlet(res => new Response(res).json())

let get = async url => {
    let res = await fetch(url)
    return parseInWorker(res)
}

但我总是得到错误:DataCloneError:无法克隆响应对象。我尝试所有解决方案,如:

let clonedRes = res.clone()
let clonedRes = JSON.parse(JSON.stringify(res))
let clonedRes = Object.assign({}, res)

但没有任何作用。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

首先

  

我听说如果我获取主线程并解析为worker,   表现会很好

不是很正确,从工作人员那里发送一些东西,然后从工人那里回来会产生一些成本,所以需要对其进行评估,以考虑是否有额外的性能优势。

其次,当您向工作人员发送数据并从工作人员返回主线程时,将使用structured cloning algorithm对其进行序列化。并非所有内容都可以使用此算法进行序列化。我怀疑Response也可以序列化,因为它包括流。即使这样,将响应发送给Web worker也不会在这种特殊情况下为您提供任何优势