一尘不染

Angular JS中未调用Promise回调

angularjs

如果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);
    });
}

阅读 215

收藏
2020-07-04

共1个答案

一尘不染

在AngularJS中,承诺结果在$ digest周期内异步传播。因此,仅在进入$ digest循环时才调用在then()中注册的回调函数。

因此,当您的套接字连接时,我们处于摘要周期。
then()创建一个新的Promise,但是then()直到下一个摘要周期(永远不会到来的摘要周期)之前,它的结果才会传播(因为没有$timeout,或$http,或DOM事件触发一个)。正如@Ajay刚刚发布的那样,如果添加$
scope。$ apply(),它将导致摘要周期,您将看到结果。

2020-07-04