从下面的代码中,我想选择一些数据,然后更新 适合条件,最后运行两个URL来完成其他一些任务。
我可以更新第二个knex更新查询,但是,它无法运行两个发布请求中的任何一个,我想知道为什么吗?
router
.get('/xxxx', function(req, res){
_DB_Knex('xxx')
.where({
"xxxx": "xxxx"
})
.select('xxxx.*', 'xxx.xxx as xxx', 'xxx.xxxx')
.leftJoin('xxxx', 'xxx.xxx', 'xxx.xxx')
.then (function (data) {
if(data && data.length>0){
for(var i=0; i<data.length; i++){
if(xxxxx){
var xxx = xxxxx;
var xxx = data[i].xxxx;
var xxx = data[i].xxxx;
var xxx = data[i].xxx;
if(xxx>=xxx){
_DB_Knex('xxxx')
.where({
xxx: "xxxx",
xxx: xxxx
})
.update({
xxxx : "xxxx"
})
.then(function(){
request.post({
url: `${api_url}/xxxxx/s`,
body: {
xxx: xxxx
},
json: true
});
request.post({
url: `${api_url}/xxxx/xxxx`,
body: {
xxx: xxxx
},
json: true
});
return null;
});
}
}
}
}
}});
答案 0 :(得分:0)
已发布的代码已删除,因此很难精确显示如何重构它,但是有必要的更改和建议的更改。
建议的更改是使router.get()
正确。首先看...
// get the xxx route. return a promse that resolves to the get response
// TODO: error handling
function getXXX() {
return new Promise(function(resolve, reject) {
router.get('/xxxx', function(req, res){
resolve(res);
});
});
}
打电话给...
function theOPFunction() {
return getXXX().then(function(res) {
return _DB_Knex('xxx')
.where({ "xxxx": "xxxx" })
.select('xxxx.*', 'xxx.xxx as xxx', 'xxx.xxxx')
.leftJoin('xxxx', 'xxx.xxx', 'xxx.xxx')
}).then(function(data) {
return loopAndGatherPromises(data); // see below
})
}
所需的更改是,通过data
的循环必须收集其中产生的承诺,并与Promise.all()
一起运行。
function loopAndGatherPromises(data) {
let promises = [];
if(data && data.length>0){
for(var i=0; i<data.length; i++){
if(xxxxx){
var xxx = xxxxx;
var xxx = data[i].xxxx;
var xxx = data[i].xxxx;
var xxx = data[i].xxx;
if(xxx>=xxx){
promises.push(updateAndPost(data));
}
}
}
}
return Promise.all(promises);
}
// updateAndPost answers a chain of three promises update the db and
// post to two web services. note these 3 chained promises probably
// could be made parallel with promise.all
function updateAndPost(data) {
return _DB_Knex('xxxx').where({xxx: "xxxx",xxx: xxxx}).update({ xxxx : "xxxx"}).then(function(){
return request.post({
url: `${api_url}/xxxxx/s`,
body: { xxx: xxxx },
json: true
});
}).then(function() {
return request.post({
url: `${api_url}/xxxxx/xxxx`,
body: { xxx: xxxx },
json: true
});
});
}