这种ajax异步赋值的是如何做到的?
发布于 10 年前 作者 think2011 9849 次浏览 最后一次编辑是 8 年前
// 这是一个模拟ajax异步返回数据
var getData = function () {
    var data = null;
    setTimeout(function () {
        data = '成功得到数据';
    }, 500);

    // 如何返回异步的data?
    return data;
};
 
 
// 在不改变此调用方式的情况下,如何得到异步的数据??
var data = getData();

首先请不要质疑这种不用callback的的实现方式。 angular中的模块ngResource是可以做到的,但不知道是如何的实现原理。

ngResouce中文 ngResouce官方

21 回复

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一下~~

没用过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 是的,我是新手,我现在明白了。

@think2011

function ajax(url){ var xmlHttp=new XMLHttpRequest(); xmlHttp.open(“GET”,url,false); xmlHttp.send(null); return xmlHttp.responseText; }

xmlHttp.open的第三个参数是控制同步还是异步的true=异步, false=同步

回到顶部