【问题标题】:How to perform edits to a draft object using Immer.js after promise has resolved without using async/await如何在不使用 async/await 的情况下解决 promise 后使用 Immer.js 对草稿对象执行编辑
【发布时间】:2021-05-27 18:58:01
【问题描述】:

我正在尝试对来自 Immer 的草稿对象进行编辑,这取决于承诺的解决。我了解如何使用async/await 语法来做到这一点,(见下文)

import produce from 'immer';

Promise.resolve({ eggs: 0 }).then(
  produce(async (eggCounter) => { const n = (await 5); eggCounter.eggs += n; })
).then(console.log)

但是当我尝试将其转换为使用显式 Promise API 时,它不起作用:

import produce from 'immer';

Promise.resolve({ eggs: 0 }).then(
  produce((eggCounter) => { Promise.resolve(5).then((n) => eggCounter.eggs += n) })
).then(console.log)

以上产生错误Uncaught (in promise) TypeError: illegal operation attempted on a revoked proxy

如何修改第二个样本,使其(充分)等同于第一个样本?

【问题讨论】:

  • await号码是什么?
  • 这只是一个例子。在实际情况下,它是来自 API 的 Promise。

标签: javascript async-await es6-promise immer.js


【解决方案1】:

只为produce回调函数返回一个promise:

内嵌版本

Promise.resolve({ eggs: 0 }).then(
  produce((eggCounter) => Promise.resolve(5).then((n) => { eggCounter.eggs += n; }))
).then(console.log)

清晰版

Promise.resolve({ eggs: 0 }).then(
  produce((eggCounter) => {
    return Promise.resolve(5).then((n) => {
      eggCounter.eggs += n;
    });
  })
).then(console.log);

【讨论】:

  • 这是正确的,虽然我错过了一个重要的 other 细节是传递给 then 回调内的 then 调用的函数不能返回值(否则 immer 会抱怨您正在扩充草稿返回一个值。
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2019-12-04
  • 2021-04-27
  • 2022-11-15
相关资源
最近更新 更多