// 这是一个模拟ajax异步返回数据
var getData = function () {
var data = null;
setTimeout(function () {
data = '成功得到数据';
}, 500);
// 如何返回异步的data?
return data;
};
// 在不改变此调用方式的情况下,如何得到异步的数据??
var data = getData();
首先请不要质疑这种不用callback的的实现方式。 angular中的模块ngResource是可以做到的,但不知道是如何的实现原理。
getDevices: function(projectID){
var q = $q.defer();
$http.get('').success(function (data) {
q.resolve(data);
}).error(function(data){
q.reject(data);
})
return q.promise;
}
@nihgwu angular版本1.2+。 经实践,调用方式是
getDevices(1).then(function(result){
// var data = result;
});
主要想知道怎么做到
var data = getDevices(1);
这样的调用方式。
如果真的是异步那么不可能通过var data = getData();直接获取到其值得 它获得的应该是一个事件的句柄(不知道称呼对不) ,当需要其值时应该还有后续的触发 ngResouce那个你是否已经全部看完了呢 不能只看开头的
@xinght 是的,我理解你的意思,应该是有后续的触发的,好像说是 把 getData(); 整个就替换成了ajax后的数据,所以data也就有数据了,但是我看不懂ngResouce的源码,所以不知道是不是真的,该如何实现。
没用过angular,但是仔细看了你给的ngResource文档,我觉得没有任何问题。实现不同,但是能观察到的现象应该是和你这段代码一致的:先返回一个对象,然后通过闭包在回调后改变这个对象的值。 你那段代码唯一的问题就是data不能是简单类(你用的是String),必须是地址引用的对象。
//简单工厂 function Data(name,value){ this.name = name; this.value = value; }// 这是一个模拟ajax异步返回数据 var getData = function () { var data = new Data(‘name’,’value’); setTimeout(function () { data.name = 'newName’; data.value= 'newValue’; }, 500);
// 如何返回异步的data? return data;
};
// 在不改变此调用方式的情况下,如何得到异步的数据?? var data = getData();
就异步的理论而言,回调只是异步的一种方式,比如还有一种基于轮询的异步方式,虽然不常用。如这样: var data=getData();//假设getData()返回{isCompleted:true,html:’’} //其它代码,当需要data的结果时 while(data.isCompleted) { }
就你的问题取ajax的返回,我认为这里用同步的ajax更合适。
@nodejser angularjs明显用的不是同步。
angularjs中数据绑定后,只要绑定的变量值修改了,对应的元素马上就会有响应,这个不可能是通过简单的同步修改来做的。楼上的闭包解释更合理一些。如果能找到对应的源代码就更好了
文档里不是说得很明白了吗,data开始只是个空架子,在异步调用返回后才填充
var getData = function (cb) {
var data = {};
setTimeout(function () {
data.prop = '成功得到数据';
cb();
}, 500);
return data;
};
var data = getData(function() {
console.log('async returned: ' + data.prop);
});
console.log('sync returned: ' + data.prop);