首页 > 解决方案 > 如何在 Typescript 中创建一个运行器函数,仅当它不在事务中时才调用领域写入?

问题描述

我正在使用多个提供商来处理我的领域,因此他们需要确保没有其他提供商确实在操纵领域。

这样的检查可能如下所示:

  const createNode = (
    type: NodeType,
    name?: string,
    value?: string,
  ): Node & Realm.Object => {
    const realm = realmRef.current;
     
    (function writeItemLoop(i) {
      setTimeout((): Node & Realm.Object => {
        if (!realm.isInTransaction) {
          let node: Node & Realm.Object;
          realm.write(() => {
            node = realm.create<Node>('Node', {
              type: type,
              name: name,
              value: value,
            });
          });
          return node;
        } else {
          console.log(`realm was busy ${i}`);
          if (++i <= 10) {
            writeItemLoop(i);
          } else {
            console.log('canceling transaction');
            realm.cancelTransaction();
            i = 1;
            writeItemLoop(i);
          }
        }
      }, 1000);
    })(1);
  };

1.th 问题是:如何告诉 Typescript 忽略警告:

并非所有代码路径都返回 value.ts(7030)

因为一旦领域超出其事务,结果将如声明的那样。

  1. 如何使用泛型编写包装函数以将内部事务包装为回调,如下所示:

内部回调:

let node: Node & Realm.Object;
realm.write(() => {
    node = realm.create<Node>('Node', {
    type: type,
    name: name,
    value: value,
  });
});
return Node;

包装:

const realm = realmRef.current;  
(function writeItemLoop(j) {
  setTimeout((): Node & Realm.Object => {
    if (!realm.isInTransaction) {
      return callback(...args);
    } else {
      console.log(`realm was busy ${i}`);
      if (++i <= 10) {
        writeItemLoop(i);
      } else {
        console.log('canceling transaction');
        realm.cancelTransaction();
        i = 1;
        writeItemLoop(i);
      }
    }
  }, 1000);
})(1);

感谢您的任何建议!

标签: javascriptreactjstypescriptmongodbrealm

解决方案


推荐阅读