2017-07-30 115 views
0

我曾尝试下面的代码,但得到undefined函数返回`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()这显然会返回一个承诺,一个异步任务。完成该任务(.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(…)在承诺履行后做了些事情。