// 这是一个模拟ajax异步返回数据
var getData = function () {
var data = null;
setTimeout(function () {
data = '成功得到数据';
}, 500);
// 如何返回异步的data?
return data;
};
// 在不改变此调用方式的情况下,如何得到异步的数据??
var data = getData();
首先请不要质疑这种不用callback的的实现方式。 angular中的模块ngResource是可以做到的,但不知道是如何的实现原理。
setTimeout 里的第一个参数不就是 callback 函数吗。
ngResource 只是 $http的一个封装 里面还是对$http的调用 $http 本身使用的是promise ngResource 返回的resource对象本身就是一个promise对象
@gloomyzerg 不理解,可是为什么例如 var data = Data.get();
data就能得到ajax异步后数据呢? 正常情况下,由于数据是延迟的,没办法return。
@leapon 你理解错了,是想知道类似 var data = getData();
这样的ajax请求的数据,是怎么做到的。
getDevices: function(projectID){
var q = $q.defer();
$http.get('').success(function (data) {
q.resolve(data);
}).error(function(data){
q.reject(data);
})
return q.promise;
}
看23楼好像是说使用 Promise/Deffered 模式……这个本人不太熟……
@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的源码,所以不知道是不是真的,该如何实现。
ajax有同步模式, 用同步就完全不用callback了, google一下~~
@xujun52011 求链接!
没用过angular,但是仔细看了你给的ngResource文档,我觉得没有任何问题。实现不同,但是能观察到的现象应该是和你这段代码一致的:先返回一个对象,然后通过闭包在回调后改变这个对象的值。 你那段代码唯一的问题就是data不能是简单类(你用的是String),必须是地址引用的对象。
<pre> //简单工厂 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();
</pre>
@yuhj86 赞!! 原来如此,真的好巧妙,谢谢!!
就异步的理论而言,回调只是异步的一种方式,比如还有一种基于轮询的异步方式,虽然不常用。如这样: 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);
@yuhj86 那怎么保证500ms内不要用 data 呢
@leapon 楼主的问题是如何异步赋值,和500ms没有任何关系。如果一定要直接使用的话,你可以监听data的属性变化来写业务逻辑。
@ravenwang 是的,我是新手,我现在明白了。
function ajax(url){ var xmlHttp=new XMLHttpRequest(); xmlHttp.open(“GET”,url,false); xmlHttp.send(null); return xmlHttp.responseText; }
xmlHttp.open的第三个参数是控制同步还是异步的true=异步, false=同步