没有返回socketId

时间:2016-02-29 14:33:12

标签: google-chrome-app

var npm = require('npm');

npm.load({ 'save-dev': true }, function (err) {
    if (err) console.log(err);

    npm.commands.install(['lodash'], function (err, data) {
        if (err) return console.error(err)
    });
});

调用此函数时:

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;
}

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

2 个答案:

答案 0 :(得分:1)

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

是一个异步函数,outter sockeId返回将早于内部。所以返回值为-1因为当底部的socketId返回时,内部函数甚至都不被调用。

一种可能的解决方案是创建一个异步函数并将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);
    }    
 });

答案 1 :(得分:-1)

使你的变量在全局范围内,这将阻止你的所有问题。



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;
}