节点js异步调用

时间:2019-12-05 05:39:49

标签: javascript node.js asynchronous

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

代码

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)

1 个答案:

答案 0 :(得分:2)

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

@api.multi
    def synchronization_contract_performance_rate(self):

        self.env['report.rental.income.from.property'].search([]).unlink()

        product_dict = {}
        A_product = self.env['product.product'].search([])
        for a in A_product:
            product_dict[a.name] = a.id

        activities_dict = {}
        D_activities = self.env['rh.commercial.activities'].search([])
        for d in D_activities:
            activities_dict[d.name] = d.id

        address_dict = {}
        i = 0
        address_model_list = ['res.country.area', 'res.country.district', 'res.country.town']
        address_field_list = ['area_id', 'district_id', 'town_id']
        for addr in address_model_list:
            C_address = self.env[addr].search([])
            addr_dict = {}
            for c in C_address:
                addr_dict[c.name] = c.id
            address_dict[i] = addr_dict
            i += 1

        record_list_1 = self.company_recursive_func()

        for list_1 in record_list_1:
            database = list_1[0]
            link_url = list_1[1]
            if link_url.startswith('http://'):
                _uri = link_url.replace('http://', '')
                my_odoo = odoorpc.ODOO(_uri, port=48080)
            if link_url.startswith('https://'):
                _uri = link_url.replace('https://', '')
                my_odoo = odoorpc.ODOO(_uri, port=443, protocol='jsonrpc+ssl')

            username = list_1[2]
            password = list_1[3]

            my_odoo.login(database, username, password)

            company_id = list_1[4]
            company_code = list_1[5]

            product_actual_business_dict = {}
            A_product_actual_business_ids = my_odoo.env['product.product'].search([])
            A_product_actual_business = my_odoo.execute('product.product', 'read', A_product_actual_business_ids,
                                                        ['actual_business'])
            for a in A_product_actual_business:
                name_list = []
                for b in my_odoo.execute('rh.commercial.activities', 'read', a.get('actual_business'), ['name']):
                    name_list.append(b.get('name'))
                product_actual_business_dict[a.get('id')] = name_list


            remote_ids = my_odoo.env['report.rental.income.from.property'].search([])
            remote_data_dict = my_odoo.execute('report.rental.income.from.property', 'read', remote_ids, ['product_id',
                                                                                                          'start_date',
                                                                                                          'create_date',
                                                                                                          'create_uid',
                                                                                                          'write_date',
                                                                                                          'write_uid',
                                                                                                          'end_date',
                                                                                                          'should_pay',
                                                                                                          'balance_pay',
                                                                                                          'real_pay',
                                                                                                          'rental_compliance_rate',
                                                                                                          'area_id',
                                                                                                          'road_name',
                                                                                                          'district_id',
                                                                                                          'town_id'])

            for data in remote_data_dict:



                remote_product_name = data.get('product_id')[1]
                product_id = product_dict.get(remote_product_name + '(' + company_code + ')',
                                              None)

                if product_id:
                    i = 0
                    address_id_list = []
                    for address_field in address_field_list:
                        if data.get(address_field):
                            remote_address_name = data.get(address_field)[1]
                            local_address_id = address_dict[i].get(remote_address_name, None)
                            address_id_list.append(local_address_id)
                        else:
                            address_id_list.append(None)
                        i += 1


                    ids_list = []
                    find_names = product_actual_business_dict.get(data.get('product_id')[0])
                    for find_name in find_names:
                        id = activities_dict.get(find_name, None)
                        if id:
                            ids_list.append(id)


                            value = {
                                'product_id': product_id,  
                                'area_id': address_id_list[0],  
                                'district_id': address_id_list[1],  
                                'town_id': address_id_list[2],  
                                'road_name': data['road_name'],  
                                'start_date': data['start_date'],  
                                'end_date': data['end_date'],  
                                'should_pay': data['should_pay'],
                                'real_pay': data['real_pay'],
                                'create_date': data['create_date'],
                                'create_uid': data['create_uid'][1],
                                'write_date': data['write_date'],
                                'write_uid': data['write_uid'][1],
                                'balance_pay':data['balance_pay'],
                                'rental_compliance_rate': data['rental_compliance_rate'],
                                'company_id': company_id,  
                                'actual_business': [(6, 0, ids_list)]
                            }




                self.env['report.rental.income.from.property'].create(value)

            my_odoo.logout()