Как мне сделать этот блок кода, чтобы завершить выполнение перед другими кодами после него? - PullRequest
0 голосов
/ 06 февраля 2019

Я отчаянно пытался позвонить модели "Feature", прежде чем перейти на линию (if(serviceExists===undefined)), как показано ниже, но безрезультатно.Я думал, что async await - это путь, но он тоже не помогает.

Я попытался поместить первый блок if в Promise и разрешить serviceExists в переменной для Promise, но это не помогло.тоже не работает.Поток кода просто ждет, пока Feature.query выберет объекты, и переходит ко второму блоку if, т.е. (if(serviceExists === undefined)).И выполнение этого блока зависит от предыдущего.Поток никогда не достигает "базовой" проверки (т. Е. 1-го блока if, в 1-м блоке снаружи if).Как мне сделать так, чтобы он ожидал результата от Feature Feature перед дальнейшим выполнением?

 let clientFeatures = await ClientFeature.query("clientId")
    .eq(clientMongoId)
    .exec();

  if (clientFeatures.length > 0) {
    var serviceExists;
    clientFeatures.map(async item => {
      let existingFeature = await Feature.queryOne("id")
        .eq(item.featureId)
        .exec();
      let existingFeatureType = existingFeature.type;
      if (
        existingFeatureType === "base" &&
        reSelectedFeatureType === "base"
      ) {
        existingBaseFeatureId = existingFeature.id;
        if (existingBaseFeatureId === reSelectedFeature[0].id) {
          serviceExists = true;
        }
      }
    });
  }

  if (serviceExists === undefined) {
    var clientFeatureGen = await ClientFeature.create({
      id: uuidv1(),
      clientId: clientMongoId,
      featureId: featureMongoId
    });
  }

1 Ответ

0 голосов
/ 06 февраля 2019

Поскольку вы используете асинхронную функцию в map, вы должны «дождаться» всех обещаний, которые она создает, используя Promise.all

См. Эту запись для получения подробной информации и пример CodePen.

Код взят из CodePen:

const arr = [ { key: 1 }, { key: 2 }, { key: 3 } ]
const results = arr.map(async (obj) => { return obj.key; });
Promise.all(results).then((completed) => document.writeln( `\nResult: ${completed}`));
...