У меня есть этот фрагмент рабочего кода, который я действительно хочу упростить. Он предназначен для Node.js v6.0 с пакетами bluebird & co. Это типичная ситуация, и я хотел бы, чтобы код был компактным и простым для понимания, чтобы я мог повторно использовать его в других проектах.
Функция возвращает один контрольный список с несколькими категориями элементов (1:m), и каждая категория содержит несколько элементов (1:m:n). Итак, это объект с двумя вложенными уровнями:
Root: Checklist
Level 1: Checklist Item Group(s)
Level 2: Checklist Item(s)
Корневой уровень (1 контрольный список) и один уровень ниже (категории элементов контрольного списка) могут быть реализованы в функции генератора с помощью yield.
Уровень 1: n: m не может использовать «доходность», когда я бы использовал, например. Promise.mapSeries() вместо checklist.__node__ChecklistItemGroups, потому что «доходность» поддерживается только в основной функции генератора, а не во внутренней функции карты. Поэтому я вернулся к функции Promise.each() и конструкции Promise.then().
function getGraphChecklistById(pId) {
return co(function *() {
let checklist = yield getChecklistById(pId); // Returns a promise.
checklist.__node__ChecklistItemGroups = yield fetchChecklistItemGroupsByChecklistId(pId); // Returns a promise.
return checklist;
})
.then(function (checklist) {
return Promise.each(
checklist.__node__ChecklistItemGroups,
function (pItem) {
return fetchChecklistItemsByXrefId(pItem.xchlclig_id).then(function (result) { // fetchChecklistItemsByXrefId() returns a promise.
pItem.__node__ChecklistItems = result;
});
})
.then(function (unused) {
return checklist;
});
})
}
Это пример результата:
result: {
"checklist-field-1": 1,
"checklist-field-2": 1,
"__node__ChecklistItemGroups": [
{
"checklist-group-field-1": 1,
"checklist-group-field-2": 1,
"__node__ChecklistItems": [
{
"checklist-item-field-1": 1,
"checklist-item-field-2": 1,
},
{
"checklist-item-field-1": 2,
"checklist-item-field-2": 2,
}
]
},
{
"checklist-group-field-1": 2,
"checklist-group-field-2": 2,
"__node__ChecklistItems": [
{
"checklist-item-field-1": 1,
"checklist-item-field-2": 1,
},
{
"checklist-item-field-1": 2,
"checklist-item-field-2": 2,
}
]
}
]
}
Любые предложения от эксперта Promise/Coroutines? Спасибо за ваше время.