我有一个使用 AJAX 调用的 Node/Express 部分,并且应该在进行 2 次后续 API 调用后将状态更新发送回 View 。此工作流依赖 csv-to-array 模块来读取 Ship-orders.csv 文件,并确定是否已发生第二个 API 调用(POST 到 Shipments)。它应该通过将 csv 文件中的 OrderNumber 与 FindOrders 端点(第一个 API)返回的 OrderNumber 进行匹配来实现此目的。
问题是我正在创建 2 个订单号数组进行比较,但将第一组订单号与第二组订单号匹配要么始终返回 true,要么始终返回 false,并且非常清楚地应该为 csv 中的第一条记录显示“true”,为其他记录显示“false”。
在进入大部分代码之前,这里是将 csv 文件读入数组的 promise :
csv 到数组:
var csvShipPromise = new Promise(function(resolve, reject){
var csvColumns = ['ChannelName', 'OrderNumber', 'LineNumber', 'WarehouseCode', 'Qty', 'Carrier', 'TrackingNumber', 'Shipdate', 'ShipMethod'];
var csvShipArr;
var csvArr;
csvArray({
file: shipLog,
columns: csvColumns
}, function(err, array){
csvShipArr = array;
resolve(csvShipArr);
});
});
接下来,我有一个很长的 promise ,当对部分请求发出时,该 promise 就会被执行。记录的 OrderNumbers 和需要发布到 Shipments 的 OrderNumbers 之间的比较是第 5 个“then” block (在下面的代码中对其进行了注释)。
router.get 和链式 promise :
router.get('/', function(req, res, next) {
findPromise.then(function(findData){
//Properly format xml string
var foundData = replaceAll(findData, '<', '<');
foundData = replaceAll(foundData, '>', '>');
return foundData;
}).then(function(foundData){
//Parse xml to JSON and stringify
var parsedFound;
parseString(foundData, function(err, result){ //uses an xml to json module
parsedFound = JSON.stringify(result);
});
return(parsedFound);
}).then(function(parsedStr){
//Parse JSON and return an array of objects
var parsedJson = JSON.parse(parsedStr);
var orders = parsedJson['soap:Envelope']['soap:Body'][0]['FindOrders'][0]['orders'][0]['order'];
return orders;
}).then(function(orders){
//Get only orders with a tracking number.
var trackArray = [];
var ord;
for(ord in orders){
var postObj = orders[ord];
if(postObj.TrackingNumber[0].length > 1){
trackArray.push(postObj);
}
}
return trackArray; //array of orders that contain tracking numbers
}).then(function(trackArray){
/**** This is the block that is causing problems. *****/
var tItm;
var loggedOrders = [];
for(tItm in trackArray){
var alreadyLogged = false;
var trackedItm = trackArray[tItm];
var trackedOrderNum = trackedItm.ReferenceNum;
csvShipPromise.then(function(csvOrders){
var csv;
var loggedOrderArr = [];
for (csv in csvOrders){
var csvItm = csvOrders[csv];
var csvOrderNum = csvItm.OrderNumber; //gets the OrderNumber as expected
loggedOrderArr.push(csvOrderNum);
}
return loggedOrderArr; //Return a simple array of all OrderNumbers
}).then(function(loggedOrderArr){
console.log(loggedOrderArr);
console.log(trackedOrderNum);
var ord;
for (ord in loggedOrderArr){
if(trackedOrderNum == loggedOrderArr[ord]){
console.log('found');
alreadyLogged = true;
}
else {
console.log('not found');
alreadyLogged = false;
}
}
return loggedOrderArr; //Simply returning this value because the alreadyLogged test isn't working.
});
/* Here is where the test fails.
It shouldn't, because there are, say, 4 OrderNumbers in the result of the first API call,
and only 1 Order number logged in the CSV.
So it should be true once, and false 3 times.
But it is true all the time.
*/
if(alreadyLogged){
console.log('found'); //Always logs true/found.
} else {
console.log('not found');
}
}
return trackArray; //Just passing the array to the view, for now.
}).then(function(obj){
res.send(obj);
return(obj);
}).catch(function(err){
console.log(err);
});
});
当我console.log trackArray 和loggingOrderArr 的值时,我发现4 个值的数组和1 个值的数组之间应该存在交集,但由于某种原因,比较if(trackedOrderNumber ==loggingOrderArr[ord])
不起作用。
最佳答案
好吧,说实话,你的代码让我眼花缭乱。但据我所知,出现了一些事情:
- 将 var
alreadyLogged = false;
移至循环之前; - 然后在
if(alreadyLogged)
语句后添加alreadyLogged = false;
我认为这与范围有关。您基本上是在检查尚未更改的 var 的 bool 值,因为您的 promise 在 if(alreadyLogged)
我可以建议一种不同的方法吗?
为什么不使用 array.indexOf() ?
假设您有两个数组要比较 arrA 和 arrB;您可以像这样查看某个项目是否存在:
var index = arrA.indexOf(arrB[0]);
if(index == -1){
console.log('No Match');
}
else{
console.log('Match found');
}
无需任何预设标志即可查看一个数组是否包含元素。
希望有帮助。
更多背景信息:
var index = loggedOrderArray.indexOf(trackedOrderNum);
if(index == -1){
console.log('No Match');
// -1 basicaly means that there is not instance of trackedOrderNum in loggedOrderArray
}
else{
console.log('Match found');
}
关于node.js - 在 Node/Express 中,如何使用 csv-to-array 来匹配或比较嵌套 Promise 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733863/