我需要从List Off链接中获取一些数据并保存到MongoDB.

这是我的链接数组,可以是3到10个链接.

const links = ['link1', 'link2', 'link3', 'link4']

我的要求是这样的:

async function fetchAll() {
    let i = 0;
    const results = await Promise.all(links
        .map(
            (url) => {
                return request({
                    uri: url,
                    method: 'GET',
                    json: true,
                }, function (error, response, body) {
                    if(!error) {
                        generateItems(body).then((dt) => {
                            saveItemsToDB(dt).then((rp) => {
                                i++
                                if (i === links.length) {
                                    console.log('last request')
                                }
                            })
                        })

                    } else {
                        i++;
                        console.log(i, ' error')
                    }
                })
            }
        ))
}

async function generateItems(response) {//parse response & generate data}
async function saveItemsToDB(items) {//saving data to mongodb}

我必须确保数据已保存到MongoDB中,然后运行下一个请求.

But the next request runing before the saveItemsToDB function finished

推荐答案

将请求移动到返回Promise的单独函数(您应该迁移到axios/fetch,request现在已经弃用了一段时间),然后调用每个函数并等待它完成async/await,然后移动到另一个并传递所需的数据(您也应该处理try/catch的错误):

const links = ['link1', 'link2', 'link3', 'link4']

async function fetchAll() {

    for (const [i, link] of Object.entries(links)) {

        console.log(+i+1 === links.length ? 'last' : '', 'request', +i+1, link);
        
        const body = await makeRequest(url).catch(err=>throw err);
        const dt = await generateItems(body).catch(err=>throw err);
        const rp = await saveItemsToDB(dt).catch(err=>throw err);

    }
}


function makeRequest(url) {
    // migrate to axios or fetch
    return new Promise((resolve, reject) => {
        request({
            uri: url,
            method: 'GET',
            json: true,
        }, function(error, response, body) {
            if (!error) {
                resolve(body);
            } else {
                reject(error);
                console.log(url, ' error')
            }
        })
    });
}
async function generateItems(response) { //parse response & generate data}
async function saveItemsToDB(items) { //saving data to mongodb}

Node.js相关问答推荐

Express无法发布

如何使用Nextjs路由从下一步/导航在新选项卡中通过";router.ush";打开链接

未显示NPM版本

关于Node.js中的AES加密库的问题

通过PutObjectCommand上传AWS S3 PDF文件,结果为空PDF

如何在MongoDB中删除嵌套对象数组中的属性?

表达 js 错误处理程序在第一个之后被忽略

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

看起来这段代码try GET 请求发送的值变为空白

级联定时器和Jest 的异步功能

处理 UTC 日期和future

来自 child_process.exec 的错误没有这样的设备或地址,管道有帮助.为什么?

AWS EC2 npm install 突然很慢

如何在 TypeScript 中输出 Hackerrank 二叉树问题?

`npm install` 以Killed结尾

为当前目录提供服务的简单文件服务器

遍历 NodeJS 中的一系列日期

在 Jade 包含中使用变量

从 zip 文件在 AWS 中创建 lambda 函数

Mongoose - 验证邮箱语法