AngularJS

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > AngularJS > AngularJS $q.when()用法

AngularJS中$q.when()的用法实例解析

作者:无风听海

$q.when()是AngularJS中的一个方法,用于将一个值(同步或异步)统一包装为$qPromise对象,屏蔽同步值与异步Promise的差异,使调用方始终以Promise的方式进行处理,本文介绍AngularJS中$q.when()的用法,感兴趣的朋友跟随小编一起看看吧

一、$q.when()的定义与作用

1. 方法定义

$q.when(value);

2. 核心作用

$q.when() 用于将一个值(同步或异步)统一包装为 $q Promise 对象。

其本质目标是:

屏蔽同步值与异步 Promise 的差异,使调用方始终以 Promise 的方式进行处理。

二、$q.when()的参数与返回值

1. 参数类型

value 可以是以下任意一种:

参数类型行为
普通值(number、string、object 等)立即 resolve
$q Promise直接返回(或状态跟随)
thenable 对象(含 then 方法)按 Promise 规则解析
原生 ES6 Promise自动桥接为 $q Promise

2. 返回值

$q.when(...) → Promise

返回的是一个 $q Promise 对象,其状态由传入参数决定。

三、不同输入情况下的具体行为

1. 传入普通同步值

$q.when(100).then(function (value) {
  console.log(value); // 100
});

行为说明:

2. 传入$qPromise

var p = $q.defer().promise;
$q.when(p).then(function (value) {
  console.log(value);
});

行为说明:

3. 传入 thenable 对象

var thenable = {
  then: function (resolve, reject) {
    resolve('ok');
  }
};
$q.when(thenable).then(function (value) {
  console.log(value); // ok
});

行为说明:

4. 传入原生 ES6 Promise

var nativePromise = Promise.resolve('hello');
$q.when(nativePromise).then(function (value) {
  console.log(value); // hello
});

行为说明:

四、$q.when()与$q.resolve()的关系

1. 等价性说明

在 AngularJS 1.4+ 版本中:

$q.when(value) === $q.resolve(value)

2. 推荐实践

五、$q.when()的执行时机与 Digest 机制

1. 回调执行模型

$q.when(value).then(callback);

2. 与原生 Promise 的关键区别

对比项$q.when()Promise.resolve()
触发 $digest
Angular 视图更新自动$apply
框架集成深度

六、典型使用场景(重点)

场景一:统一同步与异步接口

function getConfig() {
  if (cache) {
    return $q.when(cache);
  }
  return $http.get('/config').then(function (res) {
    return res.data;
  });
}

调用方:

getConfig().then(function (config) {
  // 不关心是缓存还是网络
});

✅ 这是 $q.when() 最重要、最典型的用途

场景二:函数返回值 Promise 化

function normalize(value) {
  return $q.when(value).then(function (v) {
    return v.trim();
  });
}

场景三:桥接第三方 Promise

function wrapThirdParty(promise) {
  return $q.when(promise);
}

确保:

场景四:与$q.all()配合

$q.all([
  $q.when(1),
  $http.get('/api'),
  maybePromise
]).then(function (results) {
  console.log(results);
});

七、$q.when()与$q.defer()的对比

维度$q.when()$q.defer()
是否创建新 Promise是(轻量)是(完整)
是否控制 resolve
适用场景包装、统一接口主动控制异步流程
推荐程度谨慎使用

$q.when() 的地方,通常不应使用 $q.defer()

八、常见误区与注意事项

1. 误区:认为$q.when()是同步执行

❌ 错误认知
✔️ 实际上始终异步

2. 误区:用$q.when()代替业务逻辑判断

// 不推荐
return $q.when(flag ? value1 : value2);

可读性不佳,应合理拆分逻辑。

3. 注意:异常处理规则

$q.when(value).then(function () {
  throw new Error('error');
}).catch(function (e) {
  console.error(e);
});

九、总结

$q.when() 的本质可以概括为一句话:

将一切“可能是异步的东西”,统一为一个可控、可组合、可追踪的 $q Promise。

其工程价值体现在:

到此这篇关于AngularJS中$q.when()的用法的文章就介绍到这了,更多相关AngularJS $q.when()用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文