使用 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.
})