将回调中的变量返回到已定义的函数-NodeJS

时间:2016-07-30 14:23:13

标签: javascript node.js

music.playsong = function(vars){
//vars is an array with a Key named "song"
youTube.search(vars["song"], 2, function(error, result) {
  if (error) {
   console.log(error)

   return;
  }else {
     console.log("Success")
    return result
 }
 })
}

我目前正在将此功能称为

music.playsong(data)

但是在这个函数中,我无法访问底层回调并从中获取值。如何让 music.playsong() 在不阻止执行的情况下返回回调结果?

3 个答案:

答案 0 :(得分:0)

您希望使用异步功能作为同步。所以这是不可能的。因此,您需要将方法更改为异步,如下所示:

music.playsong = function(vars, cb){
//vars is an array with a Key named "song"
youTube.search(vars["song"], 2, function(error, result) {
  if (error) {
   console.log(error)

   process.nextTick(() => {
    cb(error)
   })
  }else {
     console.log("Success")
     process.nextTick(() => {
      cb(null, result)
     })
 }
 })
}

答案 1 :(得分:0)

music.playsong = function(vars){

youTube.search(vars["song"], 2, function(error, result) {
if (error) {
   return callback("Error",{});
}else {
    console.log("Success")
    return callback(""success",result)
    }
})
}
function callback(data){
//TODO
}

答案 2 :(得分:0)

看起来youtube.search是异步操作。

在这种情况下,您应该使用Promise

e.g。

music.playsong = function(vars) {
  return Promise(resolve, reject) {
    //vars is an array with a Key named "song"

    youTube.search(vars["song"], 2, function(error, result) {
      if (error) {
        return reject(err);
      } 
        console.log("Success")
        return resolve(result);
      }
    })  
  }
}

music.playsong('').then(function(result) {
  // you will get result here
});

在Promise中,您将resolvereject用于处理异步操作。

调用resolve后,它会将data传递给.thenreject被解决时,它会将err传递给.catch