2017-07-30 7 views
0

私は以下のコードを試しましたが、undefinedを取得しました。JS odooで関数が `undefined`を返す10

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 
    }); 
}, 

どうすれば解決できますか?

答えて

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(…)を使います。