异步等待函数返回未定义

时间:2020-02-03 16:46:23

标签: javascript node.js ajax asynchronous async-await

我发现自己不方便在异步函数内部返回某个结果,而异步函数内部具有等待请求。我尝试了这三个库(“ http ”,“ 请求”,“ 然后请求”),并且它们总是相同的。

主要思想是,当ajax结束时,应返回其结果;而是返回 undefined 它不遵守异步/等待)。


文件: index.server.js

const PyService = require("../../../api/services/PyService/validacionCSV");

module.exports = {
    pasajeClientes: async function (matcheos) {
        let resultado = await PyService.validate(matcheos);
        return resultado;
    }
}

文件: validacionCSV.js

const request = require('then-request');

module.exports = {

    validate: async (matcheos) => {

        var response;

        await request("GET", `${process.env.API_URL}/validate`, {
            json: {
                csv: {
                    clients: "datosPersonas.csv",
                    products: "movimientos.csv"
                },
                primary_keys: {
                    clients: "ID",
                    products: "ID",
                },
                branches: {
                    products: "rama",
                },
                rules: {
                    clients: matcheos["clientes"],
                    products: matcheos["productos"],
                }
            }
        }).done((resultado) => {

            let matched = resultado.ok;
            let no_relationships = resultado.no_relationships;
            let repeated = resultado.repeated;
            let total = resultado.total;
            let type_errors = resultado.type_errors;

            response = { 
                error: false,
                message: "",
                errorConTipoDatoClientes: type_errors.clients,
                errorConTipoDatoProductos: type_errors.products,
                errorConClientesSinProductos: no_relationships.clients,
                errorConProductosSinCliente: no_relationships.productos,
                errorConClientesRepetidos: repeated.clients,
                errorConProductosRepetidos: repeated.products,
                cantClientesOk: matched.clients,
                cantProductosOk: matched.products,
                cantClientesEnArchivo: total.clients,
                cantProductosEnArchivo: total.products,
            }

            if (no_relationships.clients > 0 || no_relationships.products > 0
            ||  repeated.clients > 0 || repeated.products > 0
            ||  type_errors.clients > 0 || type_errors.products > 0
            ) {
                response.error = true;
                response.message = "Los clientes/productos importados poseen errores."
            }
            else
                response.message = "Los clientes/productos importados no poseen errores."

        });

        return response;
    }
}

1 个答案:

答案 0 :(得分:1)

您正在将Promise回调与async / await混合使用。使用回调时,您无法在外部定义变量,然后在回调中实例化然后尝试在回调之外再次使用它。详细了解Promises。

我所做的就是在回调函数中返回response

尝试一下

const request = require('then-request');

module.exports = {

  validate: async(matcheos) => {

    var response;

    await request("GET", `${process.env.API_URL}/validate`, {
      json: {
        csv: {
          clients: "datosPersonas.csv",
          products: "movimientos.csv"
        },
        primary_keys: {
          clients: "ID",
          products: "ID",
        },
        branches: {
          products: "rama",
        },
        rules: {
          clients: matcheos["clientes"],
          products: matcheos["productos"],
        }
      }
    }).done((resultado) => {

      let matched = resultado.ok;
      let no_relationships = resultado.no_relationships;
      let repeated = resultado.repeated;
      let total = resultado.total;
      let type_errors = resultado.type_errors;

      response = {
        error: false,
        message: "",
        errorConTipoDatoClientes: type_errors.clients,
        errorConTipoDatoProductos: type_errors.products,
        errorConClientesSinProductos: no_relationships.clients,
        errorConProductosSinCliente: no_relationships.productos,
        errorConClientesRepetidos: repeated.clients,
        errorConProductosRepetidos: repeated.products,
        cantClientesOk: matched.clients,
        cantProductosOk: matched.products,
        cantClientesEnArchivo: total.clients,
        cantProductosEnArchivo: total.products,
      }

      if (no_relationships.clients > 0 || no_relationships.products > 0 ||
        repeated.clients > 0 || repeated.products > 0 ||
        type_errors.clients > 0 || type_errors.products > 0
      ) {
        response.error = true;
        response.message = "Los clientes/productos importados poseen errores."
      } else
        response.message = "Los clientes/productos importados no poseen errores."

      return response
    });
  }
}