use*_*741 6 asynchronous node.js async-await
似乎无法弄清楚为什么这对我不起作用.我有一个父函数在子加载进程上执行AWAIT ... LOAD进程依次调用另一个叫做LOADDATA的AWAIT ...所以基本上是这样的:
module.exports = async function () {
try {
await load();
} catch (ex) {
console.log(ex);
logger.error(ex);
}
};
async function load() {
return await new Promise((resolve, reject) => {
TableImport.findAll().then((tables) => {
for (let table of tables) {
await loadData(table.fileName, table.tableName);
}
resolve();
}).catch(function (err) {
reject(err);
})
})
};
async function loadData(location, tableName) {
return await new Promise(function (resolve, reject) {
var currentFile = path.resolve(__dirname + '/../fdb/' + location);
sequelize.query("LOAD DATA LOCAL INFILE '" + currentFile.replace('/', '//').replace(/\\/g, '\\\\') + "' INTO TABLE " + tableName + " FIELDS TERMINATED BY '|'").then(function () {
resolve(tableName);
}).catch(function (ex) {
reject();
});
});
};
Run Code Online (Sandbox Code Playgroud)
LOAD中的AWAIT失败说明:
await loadData(table.fileName,table.tableName); SyntaxError:意外的标识符
显然不了解异步的范围!
Exp*_*lls 11
您只能await在异步函数内部使用.如果嵌套在异步函数中的非异步函数,则不能await在该函数中使用:
async function load() {
return await new Promise((resolve, reject) => {
TableImport.findAll().then((tables) => {
for (let table of tables) {
await loadData(table.fileName, table.tableName);
Run Code Online (Sandbox Code Playgroud)
你有一个回调.then上面的方法.此回调不是异步.你可以这样做解决这个问题async tables => {.
但是,由于load是异步并findAll返回一个promise,您不需要使用.then:
async function load() {
const tables = await TableImport.findAll();
for (let table of tables) {
await loadData(table.fileName, table.tableName);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定是什么loadData,如果你必须按顺序加载表,但你也可以并行化:
const tables = await TableImport.findAll();
const loadPromises = tables.map(table => loadData(table.fileName, table.tableName));
await Promise.all(loadPromises);
Run Code Online (Sandbox Code Playgroud)
return await是多余的,因为你已经回复了一个承诺.只是return会工作.reject(err).此函数不会在内部处理错误,因此它也会以相同的方式传播错误.您的loadData功能也可以重写和简化:
function loadData(location, tableName) {
const currentFile = path.resolve(__dirname + '/../fdb/' + location);
return sequelize.query("LOAD DATA LOCAL INFILE '" + currentFile.replace('/', '//').replace(/\\/g, '\\\\') + "' INTO TABLE " + tableName + " FIELDS TERMINATED BY '|'");
};
Run Code Online (Sandbox Code Playgroud)
loadData因为你不使用,所以不需要异步await.你还在回复诺言..catch因为在原始代码中您没有返回错误.我上面的代码将返回由此引起的错误.query..then.| 归档时间: |
|
| 查看次数: |
9076 次 |
| 最近记录: |