该函数可从命令行运行,但不能在类内运行

时间:2018-08-12 13:56:37

标签: node.js scope bind blockchain leveldb

在命令行中,这有效:

let blockchain = new Blockchain();
var bla;
blockchain.getBlockHeightPromise().then(i => bla =  i);

// bla现在具有正确的值

在命令行中,此操作无效:

let blockchain = new Blockchain();
blockchain.addBlock(someBlock)

//控制台日志表明bla未定义

更新:为什么从命令行运行的结果与从类内部调用函数的结果不同?

//我的代码(缩写)

    class Blockchain {
    constructor() {
    }


    // Add new block
    async addBlock(newBlock) {
        var bla;
        this.getBlockHeightPromise().then(i => bla = i);
        console.log('bla: ' + bla);}
//Note addBlock needs to async because await db.createReadStream follows


    getBlockHeightPromise() {
        return new Promise(function (resolve, reject) {
            let i = 0;

            db.createReadStream()
                .on('data', function () {
                    i++;
                })
                .on('error', function () {
                    reject("Could not retrieve chain length");
                })
                .on('close', function () {
                    resolve(i);
                });
        })
    }
}

1 个答案:

答案 0 :(得分:0)

getBlogHeightPromise的承诺完成之前执行控制台语句。

使用await等待异步方法getBlogHeightPromise解决:

    // Add new block
    async addBlock(newBlock) {
        var bla = await this.getBlockHeightPromise();
        console.log('bla: ' + bla);
    }