【问题标题】:Node js asynchrounous call节点js异步调用
【发布时间】:2020-03-30 00:24:34
【问题描述】:

每次添加新数据或更新现有数据时,new_dataupdated_data 变量都会增加。但是当我尝试 console log 代码底部的总计数(new_dataupdated_data)时,结果为 0。我们如何在 Node 中使用 async 解决这个问题?

代码

let new_data = 0
let updated_data = 0

let vehicles = _.each(results.data, function (value, key) {

    let condition = { VIN: value.VIN }

    Vehicle.model.findOne(condition, function (err, doc) {
        if (doc) {
            let condition2 = { VIN: doc.VIN }
            Vehicle.model.update(condition2, value, function (err, doc1) {
                updated_data += 1
                if (doc && typeof doc.log === 'function') {
                    const data = {
                        action: 'Update',
                        category: 'Inventory Import',
                        message: 'Import Successful',
                        status: '200'
                    }
                    return doc.log(data); 
                }
            })

        } else {
            Vehicle.model.create(value, function (err, doc2) {
                new_data += 1
                if (doc2 && typeof doc2.log === 'function') {
                    const data = {
                        action: 'Create',
                        category: 'Inventory Import',
                        message: 'Import Successful',
                        status: '200'
                    }
                    return doc2.log(data);
                }
            })
        }

    })

})

console.log("new datad : ", new_data)
console.log("updated_data : ", updated_data)

【问题讨论】:

  • 如果您想使用async 进行操作,您必须访问回调中的更新值或使用Promises。如果您不想更改任何代码,则必须使函数非异步。
  • 我要做的就是获取 new_data 和 updated_data 的总数
  • 是的,它总是返回 0,因为 Javascript 中的异步显示最快的语法。此外,您可以将 console.log 放在回调函数中。

标签: javascript node.js asynchronous


【解决方案1】:

您可以使用 ASYNC/AWAIT 将该代码放入异步函数中,然后等待每个查询。我使用 for of 循环,因为它是同步的。

const func = async() => { 
    let new_data = 0
    let updated_data = 0

    for(value of results.data){
        try{
        let condition = { VIN: value.VIN }
        let doc = await Vehicle.model.findOne(condition);
        if (doc) {
                let condition2 = { VIN: doc.VIN }
                let doc1 = await Vehicle.model.update(condition2)
                updated_data += 1
                if (doc && typeof doc.log === 'function') {
                        const data = {
                            action: 'Update',
                            category: 'Inventory Import',
                            message: 'Import Successful',
                            status: '200'
                        }
                        doc.log(data); 
                }

            } else {
                let doc2 = await Vehicle.model.create(value);
                    new_data += 1
                    if (doc2 && typeof doc2.log === 'function') {
                        const data = {
                            action: 'Create',
                            category: 'Inventory Import',
                            message: 'Import Successful',
                            status: '200'
                        }
                        doc2.log(data);
                    }
            }
         }catch(err){
            console.log(err);
         }

    }

    console.log("new datad : ", new_data)
    console.log("updated_data : ", updated_data)
}

func();

【讨论】:

  • 我已经执行了代码先生,但仍然无法获取 new_Data 和更新数据计数
  • 代码没有到达 console.log("new datad : ", new_data) 行
  • @Zunnurian ,它没有到达 2 个控制台日志
  • @JhonCull 你现在可以测试一下吗?我在答案中更新了一个东西
  • 现在它的工作,你更新了什么变化先生?
猜你喜欢
  • 2019-02-12
  • 2016-12-26
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多