调用函数 return 值作为变量 - Soundcloud API

Calling a functions return value as a variable - Soundcloud API

我正在尝试在 Chrome 的控制台中进行调试,并创建了这个用于测试的小函数。

var hello = function(){
  var text = "Hello World";
  return text;
}; 

它如我所愿地工作,当我调用函数 hello() 时;它 return 是字符串 "Hello World".

现在我无法使用 Soundcloud API 解析端点使用此功能。

 var idGetter = function(){ 
    SC.get('/resolve', { url: userURL }, function(user) {
      SC.get('/users/', function() {
        return (user.id);
      });
    });
  };

当我用 console.log 替换 return 时,我得到了我在控制台中寻找的值,所以我知道它正在获取数据,但是当我使用 return我无法像在上面的 "Hello World" 函数中那样调用值。

如果有帮助,可以添加更多代码。

这是典型的 Javascript 行为这里发生的是 return 在这里发生....

var idGetter = function(){ 
 SC.get('/resolve', { url: userURL }, function(user) {
  SC.get('/users/', function() {
    return (user.id);
    // not here
  });
 });
 // Return happens here 
};

这就是 return 可能未定义的原因。人们通常有两种处理方式,回调或承诺。

1.) 回调

var idGetter = function(callback){ 
 SC.get('/resolve', { url: userURL }, function(user) {
  SC.get('/users/', function() {
    callback(user.id);
  });
 });
};
idGetter(function(id){
  return id;
})

2.) 承诺

这可能是要采取的路线,如果您使用的是框架,它可能已经包含此内容,但是,如果不只是包含 this library

var idGetter = function(){
   var deferred = Q.defer();
   SC.get('/resolve', { url: userURL }, function(user) {
     SC.get('/users/', function() {
       deferred.resolve(user.id);
     });
   });
   return deferred.promise;
}

还有其他选项可以处理这种情况,但这是最常见的 2 个选项。

更新:

另一个答案适用于类似 this 但不适用于大多数移动浏览器(希望很快)