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

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

// 这是一个模拟ajax异步返回数据
var getData = function () {
var data = null;
setTimeout(function () {
data = ‘成功得到数据’;
}, 500);

// 如何返回异步的data?
return data;

};

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

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

ngResouce中文 ngResouce官方


12 回复

要解决这个问题,我们需要理解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);
});

解释

  1. Promise对象

    • Promise 是一种用于表示异步操作最终完成或失败的对象。它有三个状态:pending(等待)、fulfilled(已成功)和rejected(已失败)。
  2. 创建Promise对象

    • getData 函数中,我们创建了一个新的 Promise 对象,并传入一个执行器函数。该函数有两个参数:resolvereject
    • resolve 函数用于将Promise的状态从pending变为fulfilled,并传递一个成功的值。
    • reject 函数用于将Promise的状态从pending变为rejected,并传递一个失败的原因。
  3. 异步操作

    • 使用 setTimeout 模拟一个耗时的异步操作,在500毫秒后调用 resolve 函数,传递一个字符串 '成功得到数据'
  4. 处理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更合适。

文档里不是说得很明白了吗,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);

在Node.js中实现AJAX异步赋值可以通过多种方式来完成,例如使用Promise、async/await或回调函数。在你的例子中,可以使用Promise或者async/await来处理异步操作,并返回异步获取的数据。

以下是使用Promise的示例代码:

// 使用Promise实现异步返回数据
var getData = function () {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve('成功得到数据');
        }, 500);
    });
};

// 调用getData并获取异步数据
getData().then(data => {
    console.log(data); // 输出: 成功得到数据
}).catch(err => {
    console.error(err);
});

这里是使用async/await的版本:

// 使用async/await实现异步返回数据
var getData = async function () {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve('成功得到数据');
        }, 500);
    });
};

// 调用getData并获取异步数据
(async function() {
    try {
        let data = await getData();
        console.log(data); // 输出: 成功得到数据
    } catch (err) {
        console.error(err);
    }
})();

以上两种方法都可以确保异步操作正确执行,并在数据准备完毕后进行相应的处理。使用Promise和async/await可以更好地管理异步代码,使代码更加清晰易读。

回到顶部