js:异步时函数返回值问题

// 这是调用函数

function superFunction(){

alert("a");

var res=subFunction();

alert(res);

alert("c");

}

// 被调用函数

function subFunction(){

return "b";

}

在这样情况下,代码会按照顺序,从前到后依次执行(如果运气不错没有错误的话),即a、b、c。

但是,当异步情况时又会发生什么呢?

// 被调用函数

function subFunction(){

$.ajax({

...

success:function(data){

return "b";

}

});

}

这时,运行的情况又是怎样的呢?

情况是这样的:a、undefined、c;

使用ajax这种异步方式,是无法直接获取返回值的,因为它的执行顺序无法保证,还没有来得及返回值就已经被调用...


那么问题来了,如何获取异步函数返回值?

把ajax设置为同步(async:false)?NO,NO,NO,我试过了,没用!说实话,这个我自己也不太明白,按理说,设置为同步了,那就 不会另开线程了,应该按代码顺序走啊,为什么还是undefined呢?求解释!


下面来说一下,如果js中遇到异步情况,获取其返回值的解决办法:

那就是——回调。

其实不仅仅是在 js中,在其它语言环境中,回调都是处理异步的最好方式。这是一种通用的技巧。比如,如果你熟悉UNIX的IO模型,就应该知道它处理异步的方式就是用回调实现的。

js由于是弱类型语言,实现回调看起来更简单一些。

// 这是回调函数

function ready(obj){

alert(obj);

}

// 这是异步函数

function async(){

$.ajax({

...

success:function(data){

ready(data);

}

});

}

// 调用异步函数

async();

这样获取data就可以了。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 JavaScript 中,异步函数返回值不能直接通过返回的方式获得,因为异步函数操作是在主线程之外执行的,直接访问返回值返回一个 undefined。同异步函数返回值也不会被储存在函数的作用域内,因为它们可能会在异步操作完成之前被回收。但是,通过使用 Promise 或者回调函数,我们可以获得异步函数返回值。 使用 Promise: Promise 是一个用于处理异步操作的对象。异步函数可以返回 Promise 对象,Promise 对象可以在异步操作完成之后调用 resolve 或 reject 方法来返回异步操作的结果。我们可以通过等待 Promise 对象的 resolve 或 reject 方法成功完成来获得异步函数返回结果。例如: ```javascript function asyncFunction() { return new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { resolve('操作成功'); }, 1000); }); } asyncFunction().then(result => { console.log(result); }); ``` 使用回调函数: 回调函数是指传递给异步函数的一个函数,它会在异步操作完成后被调用。我们可以通过传入一个回调函数来获得异步函数的结果。例如: ```javascript function asyncFunction(callback) { // 异步操作 setTimeout(() => { callback('操作成功'); }, 1000); } asyncFunction(result => { console.log(result); }); ``` 总结: 获得异步函数返回值有两种常见的方式:使用 Promise 或者回调函数。使用 Promise 操作异步函数异步函数需要返回 Promise 对象,然后我们通过等待 Promise 的成功或失败来获得异步函数返回结果;使用回调函数操作异步函数,我们需要将回调函数传递给异步函数,然后在异步操作完成后调用回调函数返回异步函数的结果。需要注意的是,同使用 Promise 和回调函数可能会产生一些意想不到的结果,在实际开发中需要根据需求来选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值