【发布时间】:2019-02-14 22:39:31
【问题描述】:
我正在尝试运行一系列任务。每个任务都是动态的,并且可能有不同的规则要遵循。这将在 AWS-Lambda 上执行。
我有一个 JSON 数组。它有一个body,里面有任务名称,它也有属性。
我需要在 body 中动态加载一个带有名称的 javascript 文件。 我需要等到该任务中的所有内容都完成。或者它失败了(无论在哪里)。如果发生失败,我需要在 forEach 循环内的当前记录中写入该数据。
我有一个老问题,我的 forEach 先完成而不等待任务完成。 这是 forEach 循环:
const jobLoader = require('./Helpers/jobLoader');
event.Records.forEach(record => {
const { body: jobName } = record;
const { messageAttributes } = record;
const job = jobLoader.loadJob(jobName);
job.runJob(messageAttributes).then(res => {
console.log('Show results');
return; // resume another record from forEach
}).catch(err => {
record.failed = true;
record.failureMessage = err.message;
console.log('I errored');
});
console.log('All Done');
});
问题是消息 All Done 被打印,然后消息 show results 被打印。一旦执行,我就会从数据库中获取结果。
这是加载任务的文件:
exports.loadJob = (jobName) => {
const job = require(`../Tasks/${jobName}`);
return job;
};
这是包含实际任务的文件: const mySqlConnector = require('../Storage/mySql');
exports.runJob = async (params) => {
let payload = {};
let dataToSend = await getUserName(params.userId.stringValue);
payload.dataToSend = dataToSend;
let moreDataToSend = await getEvenMoreData(params.userId.stringValue);
payload.moreDataToSend = moreDataToSend;
return await sendData(payload);
};
const getUserName = async (userId) => {
const query = 'SELECT * FROM user_data';
return await mySqlConnector.handler(query);
};
const getEvenMoreData = async (userId) => {
const query = 'SELECT * FROM user_data';
return await mySqlConnector.handler(query);
};
const sendData = (payload) => {
//this should be Axios sending data
};
这是 mySql 连接器本身: const mysql = require('promise-mysql');
exports.handler = async (query) => {
return mysql.createConnection({
host : '127.0.0.1',
user : 'root',
password : '',
database: 'crm'
}).then(conn =>{
let result = conn.query(query);
conn.end();
return result;
}).then(rows => {
//console.log("These are rows:" + rows);
return rows;
}).catch(error => {
return error;
});
};
任务文件可以有任意数量的需要完成的事情,当我开始添加任务时会有所不同。 我需要 job.runJob 从它起源的任何位置完成,或者它捕获一个错误,这样我就可以继续使用 forEach。
我已经尝试过使用 map 什么的,但最终的结果总是一样的。
我做错了什么?
【问题讨论】:
标签: node.js promise aws-lambda