Javascript 使用Nodejs进行异步编程-迭代一系列链接,打开它们并在完成后将它们保存到JSON
我有一个跟踪链接数组(大约30个),我想一块一块打开,找出隐藏在它们后面的真实URL。完成后,我想将“真实”URL保存到JSON文件中 在“检查”URL之前,它们看起来像这样: 然后是这样的: 我已经解决了“发现”的跟踪链接使用请求,它的工作。然而,我无法开始工作的是,在所有URL都被“请求”/“检查”之前,编写JSON文件 我知道解决方案涉及异步/等待或承诺,但我无法让它在节点中工作。对于更有经验的人来说,这可能只是几分钟的问题 异步编程的概念对我来说是非常新的,但我花了相当多的时间研究它。我想我很难将知识转移到我的具体问题上 我非常感谢你的帮助。干杯Javascript 使用Nodejs进行异步编程-迭代一系列链接,打开它们并在完成后将它们保存到JSON,javascript,node.js,json,request,Javascript,Node.js,Json,Request,我有一个跟踪链接数组(大约30个),我想一块一块打开,找出隐藏在它们后面的真实URL。完成后,我想将“真实”URL保存到JSON文件中 在“检查”URL之前,它们看起来像这样: 然后是这样的: 我已经解决了“发现”的跟踪链接使用请求,它的工作。然而,我无法开始工作的是,在所有URL都被“请求”/“检查”之前,编写JSON文件 我知道解决方案涉及异步/等待或承诺,但我无法让它在节点中工作。对于更有经验的人来说,这可能只是几分钟的问题 异步编程的概念对我来说是非常新的,但我花了相当多的时间研究它
const request = require('request');
const fs = require('fs');
let listWithRealUrls = [];
function grabAndSaveRealUrls() {
let Urls = ['https://www.trackinglink/1', 'https://www.trackinglink/2', 'https://www.trackinglink/3']
for (const Url of Urls) {
request.get(Url, function () {
let realUrl = this.uri.href;
listWithRealUrls.push(realUrl)
});
}
fs.writeFile('data.json', JSON.stringify(listWithRealUrls), function (err) {
if(err) {
console.log(err);
} else {
console.log('success');
}
})
}
grabAndSaveRealUrls();
多亏了乔纳斯的评论和之前的链接,我终于解决了这个问题。我相信还有更优雅的方式,但我是这样做的:
const request = require('request');
const fs = require('fs');
let listHoldingPromises = [];
function grabAndSaveRealUrls() {
let Urls = ['https://www.trackinglink.com/1', 'https://www.trackinglink.com/2', 'https://www.trackinglink.com/3']
for (const Url of Urls) {
let promise = new Promise(function(resolve, reject){
request.get(Url, function () {
let realUrl = this.uri.href;
resolve(realUrl);
});
})
listHoldingPromises.push(promise);
}
}
grabAndSaveRealUrls();
Promise.all(listHoldingPromises).then(values => {
fs.writeFile('data.json', JSON.stringify(values), function (err) {
if(err) {
console.log(err);
} else {
console.log('success');
}
})
});
你也不能通过看别人游泳来学习游泳。将
请求包装起来。将
调用包装成承诺,然后(同步)推送承诺,而不是推送其结果(异步到达)。您可以在该数组上使用Promise.all
,并在其中使用。然后
处理程序可以访问所有结果,然后可以将这些结果写入文件。我相信您可以通过在请求回调中添加if语句来避免使用promissions t`。检查是否所有URL都已测试,如果已测试,请编写file@gui3当然然后用二,三,做同样的事情。。。循环、嵌套函数等。从长远来看,这是行不通的。最好从一开始就用正确的方式做事(但这可能有助于理解Promise.all
是如何工作的…),这一切都很好@jonaswillms,谢谢!有没有办法在这里发布我的解决方案,这样任何面临类似问题的人都可以快速浏览一下?不幸的是,我的问题被标记为重复(这在我的回答中是广泛的概括,但嘿…。@TomDoe当然!很高兴你明白了。。。确保链接到显眼的位置,以供将来的访问者使用。。。