如何将 $q 的构造函数语法与 Angular $http 的 config.timeout 一起使用?

How to use $q's constructor syntax with Angular $http's config.timeout?

由于 Promise 现已正式规范,我如何将以下代码段中的 $q.defer() promise 创建转换为使用 $q(function (resolve, reject) {}) 构造函数语法?

// Cancel any ongoing $http request so that only the most recent $http
// callback gets invoked
var canceller;
function getThing(id) {
  if (canceller) canceller.resolve();
  canceller = $q.defer();

  return $http.get('/api/things/' + id, {
    timeout: canceller.promise
  });
}

(来自 $http docs 的 Fyi:timeout 是“......以毫秒为单位,或者承诺在解决后应该中止请求。”)

我会这样做:

var canceller = null;
function getThing(id) {
  if (canceller) canceller();
  return Promise.resolve($http.get('/api/things/' + id, {
    timeout: new Promise(function(resolve) {
      canceller = resolve;
    })
  }));
}

我假设你从来没有使用过 canceller.reject,所以你可以保留 resolve 函数本身以便下次调用它。