используйте Promise.all Promise.all
В вашем случае не следует использовать forEach с асинхронной операцией, поскольку forEach не будет ждать до обновлениязакончен, а затем позвоните дальше.Вместо этого используйте карту, например, чтобы зациклить события и вернуть обещание операции обновления, чтобы вы могли создать массив обещаний и использовать Promise.all .В затем в Promise.all вызовите следующий метод.
module.exports = function (Event) {
// remote method before hook
Event.beforeRemote('find', function (ctx, unused, next) {
var client = new Cronofy({
access_token: 'secret-token',
});
var options = {
from: "2018-10-15",
to: "2018-11-15",
tzid: 'Etc/UTC'
};
client.readEvents(options)
.then(function (response) {
var returnedEvents = response.events;
var events = _.filter(returnedEvents, function(o){
return !_.isEmpty(o.summary) && !_.isEmpty(o.event_uid) && !_.isEmpty(o.start) && !_.isEmpty(o.end);
});
const updatepromises = events.map((element) => {
return Event.upsertWithWhere({
sourceType: "external-source-a",
sourceID: element.event_uid
}, {
sourceType: "external-source-a",
sourceID: element.event_uid,
summary: element.summary,
description: element.description,
start: element.start,
end: element.end,
recurring: element.recurring
});
});
return Promise.all(updatepromises);
})
.then((result) => next())
.catch(console.log);
});
};
Или вы можете использовать async / await async / await , который более читабелен, и вам не нужно вызывать следующий цикл, который позаботится об этом за вас.
module.exports = function (Event) {
// remote method before hook
Event.beforeRemote('find', async function (ctx, unused) {
var client = new Cronofy({
access_token: 'secret-token',
});
var options = {
from: "2018-10-15",
to: "2018-11-15",
tzid: 'Etc/UTC'
};
var response = await client.readEvents(options);
var returnedEvents = response.events;
var events = _.filter(returnedEvents, function (o) {
return !_.isEmpty(o.summary) && !_.isEmpty(o.event_uid) && !_.isEmpty(o.start) && !_.isEmpty(o.end);
});
const updatepromises = events.map((element) => {
return Event.upsertWithWhere({
sourceType: "external-source-a",
sourceID: element.event_uid
}, {
sourceType: "external-source-a",
sourceID: element.event_uid,
summary: element.summary,
description: element.description,
start: element.start,
end: element.end,
recurring: element.recurring
});
});
await Promise.all(updatepromises);
});
};