2017-09-16 233 views
0

我读过这个问题的很多答案,但我只是不明白。承诺去了哪里?我做了一个简单的工厂,一个异步调用云数据库:AngularJs返回异步工厂?

app.factory('asyncFactory', function() { 

    let toController = function() { 

    firebase.database().ref('en').once('value') // get the array from the cloud database 
    .then(function(snapshot) { // take a snapshot 
     console.log(snapshot.val()); // read the values from the snapshot 
     return snapshot.val(); // this returns later 
    }); 

    return 47 // this returns immeadiately 
    }; 

    return { 
    toController: toController // why is this necessary? 
    } 

}); 

我把它从我的控制器:

$scope.words = asyncFactory.toController(); 
console.log($scope.words); 

这里的响应:

response

正如你可以看到,47立即返回给控制器。如果我注释掉return 47,那么工厂返回undefined。稍后,异步数据日志但不会返回到控制器。我每天都在使用承诺,但我无法弄清楚承诺的去向。

第二个问题:我需要行toController: toController?我可以摆脱它吗?

谢谢!

+1

承诺并没有去任何地方,因为它不是返回它,而是返回47.阅读http://blog.ninja-squad.com/2015/05/28/angularjs-promises/。关于“我是否需要线路toController:toController”,好吧,不,但是那么你的服务根本就没有办法,而且真的没用。 –

回答

1

要在控制器中的火力点呼叫使用的结果,工厂方法需要返回一个承诺:

app.factory('asyncFactory', function($q) {  
    return { 
    toController: toController 
    }; 

    function toController() { 

    var es6promise = firebase.database().ref('en').once('value'); 

    var qPromise = $q.when(es6promise) 
     .then(function(snapshot) { // take a snapshot 
     console.log(snapshot.val()); // read the values from the snapshot 
     return snapshot.val(); // this returns later 
    }); 

    return qPromise; 
    }; 

}); 

因为火力.once方法返回一个ES6的承诺,这一承诺需要通过将其转换为$q.when$q Service承诺带入AngularJS框架。只有那些在AngularJS执行上下文应用业务将受益于AngularJS的数据绑定,异常处理,性能看,等

在控制器方面,利用.then method它从服务器返回后提取数据:

var qPromise = asyncFactory.toController(); 

qPromise.then(function(data) { 
    console.log(data) 
    $scope.words = data; 
}); 

工厂函数立即返回一个承诺。当数据从服务器到达时,数据将被放置在$scope上。

+0

完美的作品!简单易用的解决方案。 –

1

嗯,控制器正在为自己吃诺言。 (当你打电话。那么(),这意味着你在等待的承诺), 试试这个

app.factory('asyncFactory', function() { 
    let toController = function() { 
    var deferred = $q.defer(); 
    firebase.database().ref('en').once('value') // get the array from the cloud database 
    .then(function(snapshot) { // take a snapshot 
     console.log(snapshot.val()); // read the values from the snapshot 
     return deferred.resolve(snapshot.val()); // this returns later 
    }); 

    //return deferred.resolve(47) // this returns immeadiately 
    }; 

    return { 
    toController: toController // why is this necessary? 
    } 

}); 

如果您不希望此行

回报{ toController:toController //为什么这是必要的? }

app.factory('asyncFactory', function() { 

    return { 
    var deferred = $q.defer(); 

    firebase.database().ref('en').once('value') // get the array from the cloud database 
    .then(function(snapshot) { // take a snapshot 
     console.log(snapshot.val()); // read the values from the snapshot 
     return deferred.resolve(snapshot.val()); // this returns later 
    }); 

    //return deferred.resolve(47) // this returns immeadiately 
    }; 

}) 
+0

我的控制器正在从工厂返回“未定义”,即它没有等待异步响应。但谢谢你回答我的第二个问题! –