У меня есть вопрос о каком-то коде, который у меня есть. Я собираюсь опубликовать код и разобрать его ниже в секунду, однако я хотел бы объяснить это заранее. Мой код - это функция, называемая getPing, она находится на сервере узлов и переходит на веб-сайт и возвращает мне массив объектов. Он сортирует эти объекты и на основе наименьшего числа (ping) помещает их в массив. Как только все закончится, он отсортирует массив и выберет случайный объект. Этот объект, как вы увидите в коде, называется selectedserver
, затем он берет этот объект, а затем ДОЛЖЕН разрешить его и отправить данные обратно клиенту. Обратите внимание, что все это происходит в одном файле.
Как вы увидите через секунду, как только определенное условие выполнено, происходит возврат, но прямо над ним есть resolve()
, который, кажется, не может работать. Вот мой код.
Сначала мы начнем с того, с чего начинается обещание.
var getPing = function (id,index) {
return new Promise(function (resolve, reject) {
var keepAliveAgent = new https.Agent({ keepAlive: true })
options.agent = keepAliveAgent
index = index || 0;
var r = https.request(options, function (res) {
var data = []
res.on('data', function (d) {
data.push(d)
}).on('end', function () {
var buf = Buffer.concat(data)
var encodingheader = res.headers['content-encoding']
if (encodingheader == 'gzip') {
zlib.gunzip(buf, function (err, buffer) {
var o = JSON.parse(buffer.toString())
// o is what is returned
if (o.TotalCollectionSize - 20 <= index) {
console.log(o.TotalCollectionSize - 20, '<=', index)
var selectedserver = games.gameservers[Math.floor(Math.random() * games.gameservers.length)]
console.log(selectedserver)
resolve(selectedserver)
return;
}
if (index < o.TotalCollectionSize) {
index = index + 10;
console.log(index, o.TotalCollectionSize)
o.Collection.sort(function (a, b) {
return a.Ping > b.Ping
})
if (typeof (o.Collection[0]) != "undefined") {
var playerscapacity = o.Collection[0].PlayersCapacity.charAt(0)
if (playerscapacity != o.Collection[0].Capacity) {
games.gameservers.push(o.Collection[0])
}
}
getPing(id, index)
}
})
}
})
})
r.end()
//reject('end of here')
})}
Как вы можете видеть здесь:
if (o.TotalCollectionSize - 20 <= index) {
console.log(o.TotalCollectionSize - 20, '<=', index)
var selectedserver = games.gameservers[Math.floor(Math.random() * games.gameservers.length)]
console.log(selectedserver)
resolve(selectedserver)
return;
}
Когда o.Totalcollectionsize - 20 равен <= для индекса, предполагается, что он берет игры, которые он поместил в массив games.gameservers, и предполагает его разрешение. Код работает помимо части разрешения, я знаю это, потому что все console.log в этом коде работают. </p>
Теперь это мой сервер узлов, который должен отправлять разрешенные данные НАЗАД клиенту.
var server = io.listen(47999).sockets.on("connection", function (socket) {
var ip = socket.handshake.address;
var sid = socket.id;
console.log("Connection from " + ip + "\n\tID: " + sid);
http.createServer(function (req, res) {
res.setHeader('Content-Type', 'application/json');
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With")
//res.writeHead(200, { 'Content-Type': 'text/plain' });
var data = []
if (req.method == "POST") {
res.writeHead(200, { 'Content-Type': 'text/plain' });
req.on('data', function (dat) {
data.push(dat)
})
req.on('end', function () {
var gamedata = Buffer.concat(data).toString();
var game = JSON.parse(gamedata)
getPing(game.placeId, 0).then(function (r) {
console.log(r)
res.end(JSON.stringify(r))
}).catch(function (e) {
console.log(e)
})
console.log(game.placeId)
})
}
}).listen(6157)
console.log('server running')})
Как вы можете видеть, на моем сервере узлов, когда вы отправляете ему почтовый запрос, он запускает обещание.
getPing(game.placeId, 0).then(function (r) {
console.log(r)
res.end(JSON.stringify(r))
}).catch(function (e) {
console.log(e)
})
Однако до этого никогда не дойдет. Я новичок в обещаниях, поэтому я не там, где я иду неправильно. Я попробовал все (или я так думал). Я хотел бы узнать, как полностью работают обещания, потому что, очевидно, я их недостаточно понимаю. Я просто пытаюсь заставить это работать на данный момент.