如何在返回前解决承诺?

时间:2019-06-08 19:08:42

标签: javascript node.js promise

我对我拥有的一些代码有疑问。我将发布代码并将其分解如下,但是我想提前解释一下。我的代码是一个名为getPing的函数,它在节点服务器中,并进入网站并给我返回一组对象。它对这些对象进行排序,并根据最低的数量(ping)将它们压入数组。完成所有操作后,它将对数组进行排序并选择一个随机对象。正如您在代码中看到的那样,该对象称为selectedserver,然后接受该对象,然后 SHOULD 对其进行解析,然后将数据发送回客户端。请注意,所有这些都是在同一文件中发生的。

您将在第二秒钟看到,一旦满足特定条件,便会获得回报,但在此之上,还有一个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成为索引的<=,它假定将它推送到game.gameservers数组中的游戏取回,并假定它解决了这个问题。该代码除了解析部分外都起作用,我知道这是因为该代码中的所有console.log都可以工作。

现在这是我的节点服务器,应该将解析后的数据发送回客户端。

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 :(得分:0)

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

尝试这样的事情。