Javascript 使用Nodejs进行异步编程-迭代一系列链接,打开它们并在完成后将它们保存到JSON

Javascript 使用Nodejs进行异步编程-迭代一系列链接,打开它们并在完成后将它们保存到JSON,javascript,node.js,json,request,Javascript,Node.js,Json,Request,我有一个跟踪链接数组(大约30个),我想一块一块打开,找出隐藏在它们后面的真实URL。完成后,我想将“真实”URL保存到JSON文件中 在“检查”URL之前,它们看起来像这样: 然后是这样的: 我已经解决了“发现”的跟踪链接使用请求,它的工作。然而,我无法开始工作的是,在所有URL都被“请求”/“检查”之前,编写JSON文件 我知道解决方案涉及异步/等待或承诺,但我无法让它在节点中工作。对于更有经验的人来说,这可能只是几分钟的问题 异步编程的概念对我来说是非常新的,但我花了相当多的时间研究它

我有一个跟踪链接数组(大约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当然!很高兴你明白了。。。确保链接到显眼的位置,以供将来的访问者使用。。。