这是一个noob JS问题,我可以很好地用语言表达成功的Google。
function getUser(username){
var toReturn = { };
Restangular.one('users', username).get().then(function(result){
toReturn = result;
});
return toReturn //doesn't work
}
Restangular.one(...).get()
初始化REST调用以从服务器获取用户数据。 .then(...)
是在返回数据后运行的回调。但是,写入的getUser()
函数总是返回一个空对象,因为它在触发回调之前返回。我该如何编写此函数以便返回检索到的对象?
(p.s。我知道这个问题在角度方面是学术性的,因为它可以透明地处理承诺分辨率。我一般都是JS的新手,这是一个普遍的JS问题)。
答案 0 :(得分:1)
由于服务器调用是异步的,因此您应该提供回调。
您可以使用promise
或callback
使用回拨
function getUser(username, callback){
Restangular.one('users', username).get().then(function(result){
callback(result);
});
}
致电:getUser('username', function(result){ /*do stuff here */ });
使用承诺
function getUser(username){
var callback;
var promise = {then: function(cb){
callback = cb;
}
};
Restangular.one('users', username).get().then(function(result){
callback(result);
});
return promise;
}
致电:getUser('username').then(function(result){ /*do stuff here */ });)
答案 1 :(得分:0)
试试:
function getUser(username, callback){
Restangular.one('users', username).get().then(callback);
}
getUser('hsz', function(result){
console.log(result);
});
答案 2 :(得分:0)
其余的通话可能是异步通话。如果您可以控制API,则可以发出同步请求,然后等待它返回。像这样:
function getUser(username){
var toReturn = { };
return Restangular.one('users', username).get().then(function(result){
return result;
});
}
这取决于如何处理。我在这里假设then()也将返回结果。
但是,这个scneario的最佳方法是使用回调:
function getUser(username, callback) {
Restangular.one('users', username).get().then(callback);
}
答案 3 :(得分:0)
是的,这不会起作用,因为问题在于你的功能。每个AJAX调用都是异步执行的,因此就像结果一样。
如果您已经进行了类似的AJAX调用,则必须要求浏览器加载该请求,处理响应,然后执行您作为结果的最后一个参数放置的(function(result){})
因此,您必须更改函数以进行回调,例如:
function getUser(username, onResultHandler){
Restangular.one('users', username).get().then(onResultHandler);
}
然后你可以像这样使用它:
getUser('Daniel', function(user) { updateSomethingWithMyUser(user); });
你明白了吗?
答案 4 :(得分:0)
最简单的方法是不覆盖刚刚创建的对象,因为对象是通过引用传递的。
例如:
var a = function() {
var b = {};
setTimeout(function() { b.a = 'hi'; }, 100);
return b;
}
b = a();
console.log(b); // Object {}
setTimeout(function() { console.log(b) }, 100); // Object {a: "hi"}
因为我们只是设置了对象的属性,所以我们在返回的SAME对象上设置了一个属性。当你做类似的事情时:
toReturn = result;
就像在你的函数中一样,你没有改变引用的返回的东西,你正在改变返回引用的内容(它用于引用{},现在它引用它的任何结果)。
所以,在你的情况下:
function getUser(username){
var toReturn = { };
Restangular.one('users', username).get().then(function(result){
toReturn.result = result;
});
return toReturn;
}
一旦得到结果,toReturn.result
就会有结果。
答案 5 :(得分:0)
我如何编写此函数以便返回检索到的对象?
你不能,也不应该。 Restangular使调用异步,以便您的应用程序可以在等待响应时继续运行。
如果你想让它看同步,我建议采用以下方法(这里与其他答案不同):
function getUser(username){
return Restangular.one('users', username).get();
}
/* Usage */
getUser('username')
.then(function(result) {
/* do something with result */
});