2016-08-23 75 views
0

我聽說$ q和promise對於同步編程非常有用。爲什麼我的承諾中的函數沒有運行

我希望我的第二個函數能夠在我的第一個有超時的函數之後運行。所以基本上我想MT第一個函數來完成我的secondfunction工作

我的代碼之前先運行是:

<head> 
    <link rel="stylesheet" type="text/css" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script> 
</head> 

<body ng-app="myApp"> 
    <div ng-controller="myCtrl"> 
     <button ng-click="myClick()">Click Me!</button> 
    </div> 
    <script type="text/javascript"> 
    angular.module('myApp', []) 
    .controller('myCtrl',['$scope', '$timeout', '$q', function($scope, $timeout, $q){ 
    $scope.functionOne = function(){ 
     return $q(function(resolve, reject){ 
     $timeout(function(){ 
      alert("dean"); 
     }, 3000); 
     }) 
    }; 
    $scope.functionTwo = function(){ 
     alert("armada"); 
    } 

    $scope.myClick = function(){ 
     var promise = $scope.functionOne(); 
     promise.then(function(){ 
     $scope.functionTwo(); 
     }, function(){ 
     alert("fail"); 
     }) 
    }; 
}]); 
    </script> 
</body> 

Plunker:https://plnkr.co/edit/6hJF4mxrCQ17XXA43eUl?p=preview

+1

因爲你不叫'resolve'或'reject'? – Icepickle

+0

是的,正確答案已經給出 –

回答

2

創建的承諾但從未解決。但是you don't need it at all$timeout已經返回了一個承諾:

$scope.functionOne = function(){ 
    return $timeout(function(){ 
    alert("dean"); 
    }, 3000); 
}; 
+0

非常感謝! –

1

做你想要的(在我看來)是什麼做的更好的方法是:

$scope.functionOne = function(){ 
    var defer = $q.defer(); 

    $timeout(function(){ 
     defer.resolve({data:""}); // or defer.reject(data) 
    }, 1000); 

    return defer.promise; 
}; 
+0

Bergi的答案有何不同? –

+0

這取決於。 Bergi答案的'functionOne'使用$超時承諾解決承諾。在我的答案中,你可以刪除'$ timeout(function(){},1000);'並且只保留'defer.resolve({data:「」});'並且工作正常。 – gianlucatursi

相關問題