不返回 socketId

not returning a socketId

function get_socketId(host,port) {
      var socketId = -1;

      chrome.sockets.tcp.create({}, function(createInfo) {
            chrome.sockets.tcp.connect(createInfo.socketId, host, port, function(result) {
                if(result >= 0){
                     socketId = createInfo.socketId;
                     console.log(socketId);
                     return socketId;
                }
            });
     });
     return socketId;
}

调用此函数时:

console.log(get_socketId("irc.freenode.com", 6667));

总是 returns -1,同时在控制台中显示为 e.x 3。 我做错了什么?

chrome.sockets.tcp.create({}, function(createInfo) {});

是一个异步函数,外部 sockeId return 将比内部更早发生。所以 return 是 -1 因为当底部的 socketId 时甚至没有调用内部函数 returns.

一个可能的解决方案是创建一个异步函数并将 socketId 变量传递给回调:

function get_socketId(host,port, callback) {
  var socketId = -1;

  chrome.sockets.tcp.create({}, function(createInfo) {
        chrome.sockets.tcp.connect(createInfo.socketId, host, port,   function(result) {
            if(result >= 0){
                 socketId = createInfo.socketId;
                 console.log(socketId);
                 callback(null, socketId); //we pass no error and the socketId to our callback function
            } else {
                 callback('no result', null); //we pass an error
            }
        });
 });
};
//call the function here
  get_socketId("irc.freenode.com", 6667, function (err, socketId){
    if (err){
       console.error(err);
    } else { //if no error were passed 
       console.log(socketId);
    }    
 });

在全局范围内创建你的变量,这将解决你所有的问题。

var socketId;

function get_socketId(host,port) {
      socketId = -1;
      chrome.sockets.tcp.create({}, function(createInfo) {
            chrome.sockets.tcp.connect(createInfo.socketId, host, port, function(result) {
                if(result >= 0){
                     socketId = createInfo.socketId;
                     console.log(socketId);
                }
            });
     });
     return socketId;
}