使用try in last等待是一个不错的选择吗?

时间:2019-04-11 19:32:44

标签: javascript node.js

await函数调用结束时,我需要循环并等待修改后的结果。

等待所有执行并仅在完成循环后才返回结果的最佳选择是什么?

try {
    for await (var [i, object] of tablesArchive.data.entries()) {
        if (Object.keys(object).length === 0) {
            continue;
        }

        // Busca IDs de relacoes existentes
        await this.getIdByRalations(tablesArchive, object, async (newObject) => {
            where = { [whereByProperty]: newObject[whereByProperty] };
            // Atualiza ou cria o registro na base de dados
            const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
            tablesArchive.data[i].id = registro.id;
        });
    }
 } finally {
    console.log('FINALLY ');
    return tablesArchive.data;
 }

在上述情况下,仅在遍历所有索引之后,才需要修改tablesArchive.data对象,并更新信息。我想将所有修改都称为返回。

3 个答案:

答案 0 :(得分:0)

您最终不一定完全不需要。您对await的使用已经使代码“等待”,直到执行完最后2条语句为止。

为什么最终需要的特定情况是,如果您的try块可能会出现异常,并且您想确保finally块中的代码始终执行,无论是否异常。

我认为,只要有可能引发异常,就不需要在默认情况下添加此内容。问题是,如果发生异常,您要怎么办?我认为处理此问题的默认方法是让异常抛出并回滚堆栈,并且仅被第一件事所捕获。

在特定情况下,当我在连接中进行与数据库相关的工作时,我总是想要一个finally块,无论是否引发异常,我都需要释放连接:< / p>

try {
  const conn = pool.getConnection();
  await conn.query('...');
  await conn.query('...');
} finally {
   // Always release, error or not
   conn.release();
}

上面的代码块在我的源代码中相当普遍,但这只是因为我想不管是否发生异常都需要特定的内容。

答案 1 :(得分:0)

您可以将try / catch放入for循环中,并在catch块中,只需记录错误即可。然后它将继续运行,您可以将return语句放在for循环之后。

for (var [i, object] of tablesArchive.data.entries()) {
  try {
    if (Object.keys(object).length === 0) {
      continue;
    }

    // Busca IDs de relacoes existentes
    await this.getIdByRalations(tablesArchive, object, async (newObject) => {
        where = { [whereByProperty]: newObject[whereByProperty] };
        // Atualiza ou cria o registro na base de dados
        const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
        tablesArchive.data[i].id = registro.id;
    });
  } catch (e) {
    console.log(e);
  }
}
return tablesArchive.data;

答案 2 :(得分:0)

这里介绍Promise.all() API。

简短摘要:您向Promises提供了一个Promise.all()数组,请等待直到该数组中的所有Promise都完成为止。

以您的示例为例,我会这样做:

var promises = []
for await (var [i, object] of tablesArchive.data.entries()) {
    if (Object.keys(object).length === 0) {
        continue;
    }

    // I changed this line here
    // just push every async function to the promises array
    promises.push(this.getIdByRalations(tablesArchive, object, async (newObject) => {
        where = { [whereByProperty]: newObject[whereByProperty] };
        // Atualiza ou cria o registro na base de dados
        const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
        tablesArchive.data[i].id = registro.id;
    }));
}

return await Promise.all(promises).then(() => {
    console.log('All promises are finished')
    return tablesArchive.data
}).catch(err => {
    console.error('Error occured in Promises.all: ' + err)
}).finally(() => {
    console.log('All promises Finished')
})