CNode

这种ajax异步赋值的是如何做到的?

Tthink2011发布于12 年前最后回复12 年前21 回复10833 浏览0 收藏
// 这是一个模拟ajax异步返回数据
var getData = function () {
    var data = null;
    setTimeout(function () {
        data = '成功得到数据';
    }, 500);

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

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

ngResouce中文 ngResouce官方

查看回复

回复 (21)

L
leapon#1·12 年前

setTimeout 里的第一个参数不就是 callback 函数吗。

G
gloomyzerg#2·12 年前

ngResource 只是 $http的一个封装 里面还是对$http的调用 $http 本身使用的是promise ngResource 返回的resource对象本身就是一个promise对象

T
think2011#3·12 年前
引用 gloomyzergngResource 只是 $http的一个封装 里面还是对$http的调用 $http 本身使用的是promise ngResource 返回的resource对象本身就是一个promise...

@gloomyzerg 不理解,可是为什么例如 var data = Data.get(); data就能得到ajax异步后数据呢? 正常情况下,由于数据是延迟的,没办法return。

T
think2011#4·12 年前
引用 leaponsetTimeout 里的第一个参数不就是 callback 函数吗。

@leapon 你理解错了,是想知道类似 var data = getData(); 这样的ajax请求的数据,是怎么做到的。

N
nihgwu#5·12 年前
    getDevices: function(projectID){
      var q = $q.defer();
      $http.get('').success(function (data) {
        q.resolve(data);
      }).error(function(data){
        q.reject(data);
      })
      return q.promise;
    }
G
gvforjob#6·12 年前

看23楼好像是说使用 Promise/Deffered 模式……这个本人不太熟……

T
think2011#7·12 年前
引用 nihgwu

@nihgwu angular版本1.2+。 经实践,调用方式是

getDevices(1).then(function(result){ 
  // var data = result;
});

主要想知道怎么做到

var data = getDevices(1);

这样的调用方式。

X
xinght#8·12 年前

如果真的是异步那么不可能通过var data = getData();直接获取到其值得 它获得的应该是一个事件的句柄(不知道称呼对不) ,当需要其值时应该还有后续的触发 ngResouce那个你是否已经全部看完了呢 不能只看开头的

T
think2011#9·12 年前
引用 xinght如果真的是异步那么不可能通过var data = getData();直接获取到其值得 它获得的应该是一个事件的句柄(不知道称呼对不) ,当需要其值时应该还有后续的触发 ngResouce那个...

@xinght 是的,我理解你的意思,应该是有后续的触发的,好像说是 把 getData(); 整个就替换成了ajax后的数据,所以data也就有数据了,但是我看不懂ngResouce的源码,所以不知道是不是真的,该如何实现。

X
xujun52011#10·12 年前

ajax有同步模式, 用同步就完全不用callback了, google一下~~

Y
yuhj86#12·12 年前

没用过angular,但是仔细看了你给的ngResource文档,我觉得没有任何问题。实现不同,但是能观察到的现象应该是和你这段代码一致的:先返回一个对象,然后通过闭包在回调后改变这个对象的值。 你那段代码唯一的问题就是data不能是简单类(你用的是String),必须是地址引用的对象。

Y
yuhj86#13·12 年前
N
nodejser#15·12 年前

就异步的理论而言,回调只是异步的一种方式,比如还有一种基于轮询的异步方式,虽然不常用。如这样: var data=getData();//假设getData()返回{isCompleted:true,html:''} //其它代码,当需要data的结果时 while(data.isCompleted) { }

就你的问题取ajax的返回,我认为这里用同步的ajax更合适。

K
kakanjau#16·12 年前
引用 nodejser就异步的理论而言,回调只是异步的一种方式,比如还有一种基于轮询的异步方式,虽然不常用。如这样: var data=getData();//假设getData()返回{isCompleted:t...

@nodejser angularjs明显用的不是同步。
angularjs中数据绑定后,只要绑定的变量值修改了,对应的元素马上就会有响应,这个不可能是通过简单的同步修改来做的。楼上的闭包解释更合理一些。如果能找到对应的源代码就更好了

R
ravenwang#17·12 年前

文档里不是说得很明白了吗,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);
Y
yuhj86#19·12 年前
引用 yuhj86<pre //简单工厂 function Data(name,value){ this.name = name; this.value = value; } // 这是一个模拟ajax异步返回...

@leapon 楼主的问题是如何异步赋值,和500ms没有任何关系。如果一定要直接使用的话,你可以监听data的属性变化来写业务逻辑。

X
xujun52011#21·12 年前
引用 xujun52011ajax有同步模式, 用同步就完全不用callback了, google一下

@think2011

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

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

参与回复
登录后即可参与回复。登录