使用 q 构造函数创建 promise

$q 构造函数用于从使用回调返回结果的异步 API 创建 promise。

$ q(函数(解析,拒绝){…})

构造函数接收一个函数,该函数使用两个参数 resolvereject 调用,这两个参数是用于解析或拒绝 promise 的函数。

例 1:

function $timeout(fn, delay) {
    return = $q(function(resolve, reject) {
         setTimeout(function() {
              try {
                 let r = fn();
                 resolve(r);
              } 
              catch (e) {
                 reject(e);
              }
         }, delay);
     };
}
    

上面的示例从 WindowTimers.setTimeout API 创建一个 promise。AngularJS 框架提供了此功能的更精细版本。有关用法,请参阅 AngularJS $ timeout 服务 API 参考

例 2:

$scope.divide = function(a, b) {
    return $q(function(resolve, reject) {
      if (b===0) {
        return reject("Cannot devide by 0")
      } else {
        return resolve(a/b);
      }
    });
}

上面的代码显示了一个 promisified 除法函数,如果计算不可能,它将返回带有结果的 promise 或者拒绝带有原因。

然后你可以调用 .then

$scope.divide(7, 2).then(function(result) {
    // will return 3.5
}, function(err) {
    // will not run
})

$scope.divide(2, 0).then(function(result) {
    // will not run as the calculation will fail on a divide by 0
}, function(err) {
    // will return the error string.
})