在JS中处理回调的策略

时间:2014-04-09 07:31:56

标签: javascript

这是一个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问题)。

6 个答案:

答案 0 :(得分:1)

由于服务器调用是异步的,因此您应该提供回调。

您可以使用promisecallback

使用回拨

 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 */ 
});