首页 > 解决方案 > 如何在打字稿中等待递归函数完成

问题描述

我编写了一个程序来将二叉树反序列化为字符串。

let serializedTreeString: string = '';
class BinaryTreeNode {
    _val: number;
    _left: BinaryTreeNode;
    _right: BinaryTreeNode;
    constructor(val: number, left: BinaryTreeNode = null, right: BinaryTreeNode = null) {
        this._val = val;
        this._left = left;
        this._right = right;

    }
}

function _serialize(current: BinaryTreeNode) {
    if (current === null) {
        serializedTreeString = serializedTreeString.concat('-1,');
    } else {
        serializedTreeString = serializedTreeString.concat(current._val + ',');
        _serialize(current._left);
        _serialize(current._right);
    }
}

function serialize(current: BinaryTreeNode) {
    let serializedTreeString: string = '';
    _serialize(current);
    console.log(serializedTreeString);
}

let root: BinaryTreeNode = new BinaryTreeNode(20, new BinaryTreeNode(8, new BinaryTreeNode(4), new BinaryTreeNode(12, new BinaryTreeNode(10), new BinaryTreeNode(14))), new BinaryTreeNode(22));
serialize(root);

当我打印 serializedTreeString 时,它的空白作为 java 脚本是异步的。我可以使用一个计数器,它会在每次调用_serialize 时增加并在_serialize 内减少。这样我可以检查计数器是否达到 0 并打印 serializedTreeString 的值。有一个更好的方法吗?

标签: typescriptrecursioncallback

解决方案


你得到一个空字符串不是因为 javascript 是异步的(你的例子中的所有调用都是同步的)。这是因为您在内部隐藏外部变量定义serialize。只需let在前面删除serializedTreeString

function serialize(current: BinaryTreeNode) {
    serializedTreeString = '';
    _serialize(current);
    console.log(serializedTreeString);
}

一般来说,尽管在这种情况下最好避免使用全局变量并使用 return 代替:

class BinaryTreeNode {
    _val: number;
    _left: BinaryTreeNode;
    _right: BinaryTreeNode;
    constructor(val: number, left: BinaryTreeNode = null, right: BinaryTreeNode = null) {
        this._val = val;
        this._left = left;
        this._right = right;

    }
}

function serialize(current: BinaryTreeNode): string {
    if (current === null) {
        return "-1,";
    } else {
        return `${current._val},${serialize(current._left)}${serialize(current._right)}`;
    }
}

let root: BinaryTreeNode = new BinaryTreeNode(20, new BinaryTreeNode(8, new BinaryTreeNode(4), new BinaryTreeNode(12, new BinaryTreeNode(10), new BinaryTreeNode(14))), new BinaryTreeNode(22));
console.log(serialize(root));

推荐阅读