gpt4 book ai didi

node.js - 使用 for 循环和 pg​​-bluebird

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:50 24 4
gpt4 key购买 nike

如何使用 pg-bluebird ( https://github.com/aphel-bilisim-hizmetleri/pg-bluebird ) 合并 for 循环?

我想首先获取每个位置的 ID、纬度和经度(从位置表中)。然后,对于每个位置,我需要执行一个 http 请求(这是我想要 for 循环的地方)。然后,在我完成请求后,收到的数据应插入到表 Aeris 中。

我是 Node.js 新手,刚刚学习 Promise。我是否按照预期使用了 pg-bluebird?

这是我到目前为止所拥有的:

var request = require("request");
var Pgb = require("pg-bluebird");

exports.retrieve = function(){

var pgb = new Pgb();

var cnn;

pgb.connect(DB_URL)
.then(function (connection) {

cnn = connection;
var queryString = 'SELECT id, latitude, longitude FROM locations';

return cnn.client.query(queryString);
})
.then(function (result) {

console.log(result.rows);

//this needs to run for each location
//this needs to access result.rows[0].id then
//result.rows[1].id and so on
location_id = result.rows.id;

lat = result.rows.latitude;
lng = result.rows.longitude;
console.log("Lat=" + lat + " Lng=" + lng);
var aerisUrl = AERIS_URL+
"?p="+lat+","+lng+
"&radius=10miles"+
"&client_id="+CLIENT_ID+
"&client_secret="+CLIENT_SECRET;

request.get(aerisUrl,function(err,response,body){

//do something with request data
});

return cnn.client.query();

})
.then(function (result, aerisResults) {
//insert data in aeris table
return cnn.client.query(queryString);
})
.then(function (result){

console.log(result.rows);

cnn.done();
})
.catch(function (error) {

console.log(error);
});

最佳答案

首先,使用pg-promise用于与数据库通信。其次,您需要将 http 请求逻辑分离到一个返回 Promise 的函数中,这样您就可以将所有此类请求堆积到一个数组中,然后通过 promise.all 执行。所有这些都显示在下面的代码中。

var request = require("request");
var promise = require("bluebird");
var pgp = require("pg-promise")({promiseLib: promise});

var db = pgp(DB_URL);

function createRequest(r) {

var aerisUrl = AERIS_URL +
"?p=" + r.latitude + "," + r.longitude +
"&radius=10miles" +
"&client_id=" + CLIENT_ID +
"&client_secret=" + CLIENT_SECRET;

return new promise.Promise(function (resolve, reject) {
request.get(aerisUrl, function (err, response, body) {
// do something with the request data and
// then call either resolve(), if successful,
// or reject(), if failed;
});
});
}

db.query("SELECT id, latitude, longitude FROM locations")
.then(function (rows) {
var req = rows.map(function (r) {
return createRequest(r);
});
return promise.all(req);
})
.then(function (data) {
// all http requests resolved successfully,
// time to insert the data into table Aeris:
return db.query("insert into Aeris(fields) values($1, $2,...)", [/*values*/]);
})
.then(function () {
// successfully inserted data into table Aeris;

// all done!
})
.catch(function (error) {
// Ops, something failed;
console.log("ERROR:", error);
});

关于node.js - 使用 for 循环和 pg​​-bluebird,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33490768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com