函数在JS odoo 10中返回`undefined`

时间:2017-07-30 12:18:22

标签: javascript openerp odoo-10

我尝试了以下代码,但获得了undefined

init: function(parent){
    var value = this.read_data();
    console.log('value',value);//Prints undefined
}

read_data: function() {
    my_model.query(["name"]).all().then(function(data){
        console.log('dataa',data);//Here print value
        return data[0].name
    });
},

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

你的read_data函数是异步的,它调用的函数不会立即返回某些内容但只会在一段时间后才会执行此操作。因此,您不能仅仅因为函数完成时尚未返回值read_data函数。此外,您实际上不会从read_data函数本身返回任何内容。

你调用my_model.query(["name"]).all()显然会返回一个Promise,一个异步任务。完成该任务(.then(…))后,您将调用一个记录数据并返回值的函数。

到目前为止,这很好,这使整个事情返回一个承诺本身,一旦查询完成,就会对值data[0].name做出承诺。但是,这个承诺永远不会被退回,所以你无法知道这种情况何时发生。

要解决这个问题,只需从read_data

返回整个内容即可
read_data: function() {
// return the resulting promise here
//  ↓↓↓↓↓↓
    return my_model.query(["name"]).all().then(function(data){
        console.log('dataa',data);//Here print value
        return data[0].name
    });
}

这使read_data本身正确异步,并使其返回结果的承诺。现在,您可以在init函数中使用该承诺:

init: function(parent){
    this.read_data().then(function (value) {
        console.log('value', value);
    });
}

由于read_data()返回一个承诺,我们必须等待其结果,并且只有在承诺得到解决后才能行动。为此,我们再次使用.then(…)在履行承诺后再做一些事情。