如何跟踪单个JavaScript进程?

如何跟踪单个JavaScript进程?,javascript,node.js,Javascript,Node.js,这个标题可能会引起误解,因为我不知道如何用一句话来概括我的问题 我有一个场景,在这个场景中,我的脚本必须并行地将数据发布到多个URL,我正在努力弄清楚如何直观地跟踪每个URL发生了什么(即发布了什么和返回了什么)。这是我的密码: const axios = require('axios'); const postData = async (order_id) => { for(let i = 0; i < 10; i++){ let data = await

这个标题可能会引起误解,因为我不知道如何用一句话来概括我的问题

我有一个场景,在这个场景中,我的脚本必须并行地将数据发布到多个URL,我正在努力弄清楚如何直观地跟踪每个URL发生了什么(即发布了什么和返回了什么)。这是我的密码:

const axios = require('axios');

const postData = async (order_id) => {
    for(let i = 0; i < 10; i++){
        let data = await grabDataFromSomewhere(...);
        await axios.post(`http://example.net/orders/${order_id}`, {data})
            .then(response => {
                //console.log(response.data);
                console.log(i, `POSTING TO http://example.net/orders/${order_id}`);
                console.log("--- Response:", response.data)
            })
    }
}

const orders = ['5f96499a3a19135ad163', '99a3a19135ad1630238', '6499a3a19135ad16302']

orders.forEach(id => {
    postData(id)
})
const axios=require('axios');
const postData=async(order\u id)=>{
for(设i=0;i<10;i++){
让数据=等待从某处获取数据(…);
等待axios.post(`http://example.net/orders/${order\u id}`,{data})
。然后(响应=>{
//console.log(response.data);
console.log(i,`发布到http://example.net/orders/${order_id}`);
console.log(“--Response:”,Response.data)
})
}
}
const orders=['5F96499A3A119135AD163','99a3a19135ad1630238','6499a3a19135ad16302']
orders.forEach(id=>{
postData(id)
})
该脚本在将正确的数据发布到正确的URL方面工作得很好,但是控制台输出显然是一个大混乱,因为所有axios请求都完成并将其输出转储到同一个控制台

在自己的专用控制台中,监视对
postData
函数的每个单独调用的输出的最佳方法是什么


对于那些在Linux上使用screen的人来说,可视化我正在寻找的东西的一个好方法是想象每次调用
postData
生成一个新的屏幕,我可以随时附加该屏幕并查看函数的输出。

我建议使用以下代码。其思想是并行地发出所有请求,但要按照发送顺序记录它们。如果运行以下代码并检查控制台,您将看到响应以随机间隔出现,但它们总是以正确的顺序记录在浏览器中。诀窍是创建一个表示post请求的承诺映射,然后以这样的方式链接它们:当第一个请求返回时,它被记录,然后当第二个请求返回时,它被记录,依此类推。如果一个请求返回时出现问题,它的承诺仍将得到解决,但我们只会在它的所有前辈到达后记录它

我意识到这并不完全是你所要求的,但这就是我将如何努力解决你所面临的问题

另外,您有一个多维数组,所以在将其内容映射到Ajax请求之前,我会将其展平为一维数组

此解决方案基于Jake Archibald的一篇文章
const orders=['alpha','beta','gamma','delta','epsilon']
函数postToAxios(数据){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log('in set timeout',data);
如果(数据=='beta'){
拒绝(“拒绝:”+数据);
}否则{
解析(“解析:”+数据);
}
},Math.random()*1000);
});
}
函数createLogEntry(数据){
const el=document.createElement('div');
el.className=“日志条目”;
el.textContent=数据;
返回el;
}
函数createErrorEntry(数据){
const el=document.createElement('div');
el.className=“错误输入”;
el.textContent=数据;
返回el;
}
orders.map(postToAxios)
.减少(功能(顺序、承诺){
返回序列
.然后(函数(){
回报承诺;
}).然后(函数(结果){
追加(createLogEntry(结果))
},功能(原因){
追加(createErrorEntry(reason));
});
},Promise.resolve())。然后(()=>{
console.log(“全部完成”);
});
.log条目,
.错误输入{
保证金:5px;
边框:点状1px灰色;
填充:10px;
}
.错误输入{
颜色:红色;
边框颜色:当前颜色;
}

我使用输出带有前缀的日志数据。或者在JSON日志的条目中使用标记。从那里,使用
grep
tail
可以很容易地根据需要进行直播。我明白了。所以前提是仍然将所有输出转储到一个堆中,但使以后更容易通过它进行解析。我想我能做到。感谢您的建议。请查看
console.table()
->您已经在记录
i
,因此您应该能够知道控制台中的哪个输出属于哪个
axios.post()
调用。您还想看到什么?您还可以将所有日志语句排队到一个数组中,然后在执行
for
循环时立即将它们全部记录下来(这样它们就会一起记录)。这不会让您实时查看,但会让您在完成后更容易查看一个
postData()
调用的所有日志数据。正如您所指出的,这并不完全是我想要的,但这是一段非常简洁的代码,我肯定会发现它有很大的用处。