在Promise中看不到功能

时间:2019-01-03 23:29:40

标签: javascript

我有此代码:

var c = function(address, abiJson){
    var _ = this;
    this.data = {
            wallet: false,
            account:{
                address: false
            },
            contract:{
                address: address
            }
    };
    this.abi = $.getJSON(abiJson, function(abi){
        _.data.abi = abi;
        if(typeof web3 !== 'undefined'){
            window.web3 = new Web3(web3.currentProvider);
            window.cont = web3.eth.contract(abi).at(address);
        }
    });
    this.getData = function(cb){
        if(typeof _.data.abi !== 'undefined'){
            _.updateData.done(() => {
                cb(_.data);
            });
        }
        else{
            _.abi.then(() => {_.updateData
            })
            .done(() => {
                cb(_.data);
            });
        }
    }
    this.updateData = Promise.all([
            _.get('x'),
            _.get('y')
        ])
        .then(values => { 
            _.data.x.y= values[0];
            _.data.x.z= values[1];
        })
        .then(() => {
            Promise.all([
                _.get('v', 1),
                _.get('v', 2),
            ])
            .then(values => {
                _.data.y = values;
            });
        });
    this.get = function(method, args){
        return new Promise(function(resolve, reject) {
            window.cont[method](args, function(error, result){
                if(!error) resolve(result);
            });
        });
    }
}

当我在updateData函数之外获得函数_.get('x').then((x) => console.log (x))时,我将获得所有数据。但是,当我调用getData函数时,所有get函数_.get is not a function都会出错。

我只是看不出我的错误在哪里。我是使用Promise的js新手。

2 个答案:

答案 0 :(得分:0)

这是问题的精简版:

var C = function(address, abiJson){
    var _ = this;
    this.updateData = Promise.all([
            _.get('x'),
            _.get('y')
        ]);
    this.get = function( arg){ return Promise.resolve( arg)};
}
var c = new C();
c.updateData.then( values => console.log(values)); 

get的数组初始值设定项参数内调用Promise.all会出错,因为尚未添加get作为_的方法(设置为{{ 1}})。在创建数组之前添加this方法可以解决当前的问题:

get

答案 1 :(得分:-1)

_变量不能以这种方式使用。在将其作为函数调用时可以使用它,但是在创建对象时不能使用它。 您可以使用绑定功能绑定作用域。对于箭头功能,将保留范围。请尝试以下代码。我只是用_替换了所有函数,并将其绑定到getJSON的回调。如果还使用箭头功能,则不需要绑定。

var c = function(address, abiJson){
    this.data = {
            wallet: false,
            account:{
                address: false
            },
            contract:{
                address: address
            }
    };
    this.abi = $.getJSON(abiJson, function(abi){
        this.data.abi = abi;
        if(typeof web3 !== 'undefined'){
            window.web3 = new Web3(web3.currentProvider);
            window.cont = web3.eth.contract(abi).at(address);
        }
    }.bind(this));
    this.getData = function(cb){
        if(typeof this.data.abi !== 'undefined'){
            this.updateData.done(() => {
                cb(this.data);
            });
        }
        else{
            this.abi.then(() => {this.updateData
            })
            .done(() => {
                cb(this.data);
            });
        }
    }
    this.get = function(method, args){
        return new Promise(function(resolve, reject) {
            window.cont[method](args, function(error, result){
                if(!error) resolve(result);
            });
        });
    }
    this.updateData = Promise.all([
            this.get('x'),
            this.get('y')
        ])
        .then(values => { 
            this.data.x.y= values[0];
            this.data.x.z= values[1];
        })
        .then(() => {
            Promise.all([
                this.get('v', 1),
                this.get('v', 2),
            ])
            .then(values => {
                this.data.y = values;
            });
        });

}