如果connect从调用doStuff, 则会 收到消息 “套接字已连接” ,但未callback调用。我在这里想念什么?
connect
doStuff
callback
$scope.connect = function() { var defer = $q.defer(); ws = new WebSocket("ws://server.com:port"); ws.onopen = function(){ console.log("Socket connected"); defer.resolve("socket connected"); }; return defer.promise; } $scope.doStuff = function() { $scope.connect().then(function(data) { console.log("And we're off!", data); }); }
在AngularJS中,承诺结果在$ digest周期内异步传播。因此,仅在进入$ digest循环时才调用在then()中注册的回调函数。
因此,当您的套接字连接时,我们处于摘要周期。 then()创建一个新的Promise,但是then()直到下一个摘要周期(永远不会到来的摘要周期)之前,它的结果才会传播(因为没有$timeout,或$http,或DOM事件触发一个)。正如@Ajay刚刚发布的那样,如果添加$ scope。$ apply(),它将导致摘要周期,您将看到结果。
then()
$timeout
$http