AngularJS Promise使用疑问:异步请求后变量赋值问题求解
关于AngularJS Promise使用的问题解答
嘿,很高兴帮你理清这个问题!先给你明确结论:第二种写法是完全正确的,而第一种写法的问题核心在于你没搞懂JavaScript异步操作的执行逻辑~
第一种写法的问题出在哪?
我们来拆解一下第一种代码的执行顺序:
function doSomething(x) { console.log(x); } var something = 0; $http.post('/url') .then(function (response) { something = response.data; }) doSomething(something); // 这里打印0
- 首先,
$http.post是一个异步HTTP请求:当你调用它时,浏览器会把请求发送到服务器,但不会暂停代码等待响应,而是立刻继续执行后面的doSomething(something)。 - 这时候
something还是初始值0,因为服务器的响应还没回来,then里的回调函数根本还没机会执行! - 等服务器响应返回后,
then的回调才会运行,把something赋值为接口返回的数据,但这时候doSomething早就执行完了,所以你看不到正确的值。
第二种写法为什么正确?
再看第二种代码:
var something = 0; $http.post('/url') .then(function (response) { something = response.data; doSomething(something); // 这里打印接口返回值 })
- Promise的
then方法就是用来处理异步操作的后续逻辑的:它会等待异步操作完成(这里就是HTTP请求成功返回),再执行里面的回调函数。 - 把
doSomething(something)放进then回调里,就保证了只有当something被正确赋值为接口返回的数据后,才会调用doSomething,自然就能拿到正确的值了。
简单来说,异步操作的后续逻辑必须放在对应的回调里,不能直接写在异步操作外面,否则会因为执行顺序问题拿不到预期的结果。
内容的提问来源于stack exchange,提问作者Jeric John Romero
相关产品推荐
相关产品推荐

