簡體   English   中英

在承諾鏈中使用$ timeout的非連續$ timeoutId(AngularJS 1.x)

[英]Nonconsecutive $timeoutId using $timeout inside a promise chain (AngularJS 1.x)

我有一個非常簡單的控制器,它連續運行三個超時,一個在承諾鏈中一個接一個地運行。 我使用了一個函數timeoutHelper來創建超時並將其記錄到控制台。

.controller('ctrl', function($timeout) { 
    function timeoutHelper(time) {
      var t = $timeout(time);
      console.log(t);
      return t;
    }

    timeoutHelper(500)
    .then(function(){
      return timeoutHelper(500);
    })
    .then(function(){
      return timeoutHelper(500);
    });
  })

它工作正常,並且每個$timeout在500毫秒后都記錄到控制台,但是$$timeoutId是不連續的。 輸出到控制台看起來像這樣

Promise {$$state: Object, $$timeoutId: 1}
Promise {$$state: Object, $$timeoutId: 3}
Promise {$$state: Object, $$timeoutId: 5}

在承諾鏈之外創建$timeout導致連續的$$timeoutId符合預期。 為什么會這樣呢?

這是一個問題,是因為在單元測試中刷新$timeout遇到問題。 打完電話后$timeout.flush(500)三次我得到調用時拋出一個異常$timeout.verifyNoPendingTasks 這個示例只是我在應用程序中所做的簡化版本,但它演示了相同的問題。

這是代碼的Plunkr

而不是調用.then方法中的函數。 通過timeou函數作為參數的.then方法

angular.module('timeoutApp', [])

      .controller('ctrl', function($timeout, $q, $scope) {

        function timeoutHelper(time) {
          var t = $timeout(time);
          console.log(t);
          return t;
        }

        timeoutHelper(500)
        .then(timeoutHelper(500))
        .then(timeoutHelper(500));


      })

結果

Promise {$$state: Object, $$timeoutId: 1}

Promise {$$state: Object, $$timeoutId: 2}

Promise {$$state: Object, $$timeoutId: 3}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM