重複の可能性:
angularjs-コントローラーでpromiseが解決されない
低速のWebSocketサーバーをAngularJSサービスでラップしてから、コントローラーからそのサービスを呼び出しています。コールバックをコールバックにチェーンすると、すべてが正常に機能し、UIは非同期で更新されます。
コールバックの混乱をクリーンアップするために使用しようとする$q.defer()
と、遅延が呼び出されることはないようです。私はPythonのTwistedからの延期の概念に精通しているので、概念的にはすべてが機能するはずだと思いますが、そうではありません。
これは私が思いついた最短の例です。遅いWebSocketサーバーはsetTimeout関数でシミュレートされます。
<!doctype html>
<html ng-app="beta">
<head>
<title>Beta</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>
<script>
var beta = angular.module('beta', []);
var BetaCtrl = function ($scope, betaServ) {
$scope.button = function () {
serv_result = betaServ.slow();
console.log(serv_result);
serv_result.then(function (result) {
console.log('callback finished');
});
}
}
beta.service('betaServ', function($q) {
this.slow = function () {
d = $q.defer()
setTimeout(function () {
console.log('before resolve');
d.resolve();
console.log('after resolve');
}, 2000);
return d.promise;
}
});
</script>
</head>
<body>
<div ng-controller="BetaCtrl">
<button ng-click="button()">Run</button>
</div>
</body>
</html>
は次のように実行する必要があります。
- ボタンクリック
- $ scope.button()が呼び出されます。service.slow()関数を呼び出します
- service.slow()は遅延を返します
- コールバックは据え置きに登録されます
- 延期された火災、登録されたコールバックのトリガー(この部分は発生しません)
何か案は?ありがとう。