【问题标题】:How to use postMessage with the result of a promise in JS如何在 JS 中使用带有承诺结果的 postMessage
【发布时间】:2018-12-22 23:29:12
【问题描述】:

我正在尝试使用 postMessage() 将对象传递回渲染器。

代码解析良好,并在一系列提取后创建我的对象。

loadMainTbls()
.then(retVal => buildMainTbl(retVal))
.then(dat => reduceMainTbl(dat))
.then(res => postMessage(res))

如果我 console.log(res) 正确的数组被注销。我意识到 res 是一个承诺。

.then(res => postMessage(new Promise(function(resolve) {
    resolve(res)
})))

当我尝试解析 res 时,它总是作为长度为零的数组返回。在某些尝试中,我收到 # 无法克隆错误。

我试图想象我可能做错了什么但没有成功。有人可以帮助我获取 promisevalue 并将 Message 发布回渲染器。

【问题讨论】:

  • 注意.then(res => res)是完全多余的,你可以完全删除它,如果其他函数只接受一个参数,你可以简单地传递函数名而不是传递匿名箭头函数(会使你的代码更干净)
  • 不完全确定问题出在哪里,如果您希望该大承诺链的消费者能够访问结果,您可以postMessage(res); return res; 吗?
  • 您的第一点已被采纳。接下来,我不明白为什么可以注销“长”承诺链,但我不能 postMessage() 它。
  • 在脚本的第一个块中,res 不能是一个承诺,因为你不能用一个承诺来履行承诺。请澄清您所说的“我意识到 res 是一个承诺”是什么意思。在第二个脚本块中,您不能 postMessage 承诺,因为它们不是 serialisable objects
  • 我的意思是 res 是承诺链中的最后一个环节。该链的结果是一个数组。如果 res 不是可序列化的对象,我不能在发布消息中使用它。如何将 res 更改为可序列化/可克隆的对象?我将查看这篇文章 - 你是说我无法将数据转换为可以与 postMessage 一起传递的表单?

标签: javascript node.js electron postmessage


【解决方案1】:

确定的答案是,我对 Promise 的概念没有透彻的理解。在研究并将我的想法从一行一行的同步执行模式转变为创建承诺、解决承诺、.then() 心态之后。我能够解决这个问题和其他几个问题。

我试图在承诺的范围和执行之外分配值 - .then() 流。我了解到,如果我试图用一个承诺来计算一些东西。我可以在承诺链的末端做任何我想做的事情。承诺链只执行 Promise -> resolve -> .then() 或 .catch()。对不起社区,这是 101 东西,但我学到并理解了一个非常重要的原则。 Fetch 比 XHR 调用甚至异步 XHR 调用节省了很多时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2016-11-12
    • 2017-10-18
    • 2017-06-25
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多