Как сделать обещание решить перед возвращением? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть вопрос о каком-то коде, который у меня есть. Я собираюсь опубликовать код и разобрать его ниже в секунду, однако я хотел бы объяснить это заранее. Мой код - это функция, называемая 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)
        })

Однако до этого никогда не дойдет. Я новичок в обещаниях, поэтому я не там, где я иду неправильно. Я попробовал все (или я так думал). Я хотел бы узнать, как полностью работают обещания, потому что, очевидно, я их недостаточно понимаю. Я просто пытаюсь заставить это работать на данный момент.

1 Ответ

0 голосов
/ 08 июня 2019
const https = require('https');
const zlib = require("zlib");

function downloadPage(url) {
    return new Promise((resolve, reject) => {
     https.get(url,(res)=>{
         let raw = "";
         let gunzip = res.pipe(zlib.createGunzip());
         gunzip.on('data',(chunk)=>{
             raw += chunk;
         })
         .on('end',()=>{
             resolve(raw);
         })
         .on('error',(err)=>{
             reject(err);
         })

     })
    });
}

async function myBackEndLogic() {
        const html = await downloadPage('https://api.stackexchange.com/2.2/search?page=1&pagesize=2&order=desc&sort=relevance&intitle=javascript%2Bfilter&site=stackoverflow')
        return html;
}

myBackEndLogic().then((data)=>console.log(data));

Попробуйте что-то вроде этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...