如何从 angularjs 服务中的异步调用返回响应

How do I return the response from an asynchronous call inside an angularjs service?

本文关键字:异步 调用 返回 响应 angularjs 服务      更新时间:2023-09-26

我已经阅读了如何从异步调用返回响应的问题的答案?但我不确定我是否理解得很好,我认为我的问题有点不同。我以这种方式更改我的服务:

.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;
        }
    };
}])