如何从 angularjs 服务中的异步调用返回响应
How do I return the response from an asynchronous call inside an angularjs service?
我已经阅读了如何从异步调用返回响应的问题的答案?但我不确定我是否理解得很好,我认为我的问题有点不同。我以这种方式更改我的服务:
.service('CommonService',['$firebase', function($firebase){
var username;
function onComplete(result){
username = result;
};
var getData = function(){
var ref = new Firebase("https://instafame.firebaseio.com");
ref.onAuth(function(authData){
var userid = authData.uid;
console.log(userid);
var newref = new Firebase("https://instafame.firebaseio.com/users/" + userid)
newref.once("value", function(snapshot) {
var data = snapshot.val()
newUsername = data.username;
callback(newUsername);
})
});
};
return{
getUsername: function(){
getData(onComplete);
return username;}
};
}])
在我的控制器中,我存储在一个变量中,user
CommonService
的返回:
var user = CommonService.getUsername();
console.log(user);
问题是控制台仍然返回"未定义"。我试图按照建议更改代码,但它没有运行。我该怎么办?
提前致谢
异步/等待
我们需要提供一种方法来等待您的请求的响应。我们可以使用 async/await 来做到这一点,让我们做出一个承诺来处理解析我们正在检索的值;
.service('CommonService',['$firebase', function($firebase){
var username;
var getData = function(){ //declare this function as an async
return new Promise((resolve, reject) => {
var ref = new Firebase("https://instafame.firebaseio.com");
ref.onAuth(function(authData){
var userid = authData.uid;
console.log(userid);
var newref = new Firebase("https://instafame.firebaseio.com/users/" + userid)
newref.once("value", function(snapshot) {
var data = snapshot.val()
newUsername = data.username;
!!newUsername
?
resolve(newUsername)
:
reject('Error: No username found');
})
});
};
};
return{
getUsername: async function(){
username = await getData(); //await will pause execution of the code here until getData() returns a value.
return username;
}
};
}])
相关文章:
- 如何使用异步调用更改工厂的变量
- 使变量可用于不带闭包的异步调用
- 需要收集Javascript nodejs异步调用
- 如何使用jQuery等待来自回调的异步调用
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 在forEach内部进行异步调用
- jQuery没有指定异步调用级别async:false
- SPA异步调用在IE 11中不起作用
- Ember.js-模型find()方法中的异步调用
- Javascript/JQuery处理并发/异步调用和数据竞争
- 在异步调用返回之前隐藏页面
- ExtJs 处理异步调用
- ES6:在异步调用中使用生成器
- Angular js - 异步调用 $scope.users 后不更新模态值
- 在每个循环上完成异步调用,然后转到下一个节点 js
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 使用 AngularJS 的异步调用
- 循环内部的Javascript异步调用
- 使用Canvas和ForEach处理异步调用
- JavaScript/promise,对sharepoint的多个异步调用