Nodejs中这种ajax异步赋值的是如何做到的?
Nodejs中这种ajax异步赋值的是如何做到的?
// 这是一个模拟ajax异步返回数据
var getData = function () {
var data = null;
setTimeout(function () {
data = ‘成功得到数据’;
}, 500);
// 如何返回异步的data?
return data;
};
// 在不改变此调用方式的情况下,如何得到异步的数据??
var data = getData();
首先请不要质疑这种不用callback的的实现方式。 angular中的模块ngResource是可以做到的,但不知道是如何的实现原理。
要解决这个问题,我们需要理解JavaScript中的异步编程。在Node.js中,通常使用回调函数、Promise或async/await来处理异步操作。在这个例子中,我们将使用Promise
来实现异步赋值。
示例代码
// 模拟一个异步获取数据的函数
var getData = function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
resolve('成功得到数据');
} catch (error) {
reject(error);
}
}, 500);
});
};
// 调用getData函数,并使用.then()方法处理结果
getData().then(data => {
console.log(data); // 输出: 成功得到数据
}).catch(error => {
console.error(error);
});
解释
-
Promise对象:
Promise
是一种用于表示异步操作最终完成或失败的对象。它有三个状态:pending
(等待)、fulfilled
(已成功)和rejected
(已失败)。
-
创建Promise对象:
- 在
getData
函数中,我们创建了一个新的Promise
对象,并传入一个执行器函数。该函数有两个参数:resolve
和reject
。 resolve
函数用于将Promise的状态从pending
变为fulfilled
,并传递一个成功的值。reject
函数用于将Promise的状态从pending
变为rejected
,并传递一个失败的原因。
- 在
-
异步操作:
- 使用
setTimeout
模拟一个耗时的异步操作,在500毫秒后调用resolve
函数,传递一个字符串'成功得到数据'
。
- 使用
-
处理Promise的结果:
- 我们通过
.then()
方法来处理getData()
返回的Promise对象的成功情况,.catch()
方法来处理错误情况。 - 当Promise的状态变为
fulfilled
时,.then()
方法会被调用,并传入成功的值data
。 - 如果Promise的状态变为
rejected
,则.catch()
方法会被调用,并传入失败的原因。
- 我们通过
通过这种方式,我们可以轻松地处理异步操作,并且不会阻塞主线程。这种方法比直接返回数据更符合JavaScript的异步编程模型。
setTimeout 里的第一个参数不就是 callback 函数吗。
ngResource 只是 $http的一个封装 里面还是对$http的调用 $http 本身使用的是promise ngResource 返回的resource对象本身就是一个promise对象
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 模式……这个本人不太熟……
如果真的是异步那么不可能通过var data = getData();直接获取到其值得 它获得的应该是一个事件的句柄(不知道称呼对不) ,当需要其值时应该还有后续的触发 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>
就异步的理论而言,回调只是异步的一种方式,比如还有一种基于轮询的异步方式,虽然不常用。如这样: var data=getData();//假设getData()返回{isCompleted:true,html:’’} //其它代码,当需要data的结果时 while(data.isCompleted) { }
就你的问题取ajax的返回,我认为这里用同步的ajax更合适。