Обещания и асинхронные функции "заимствуют" переменные из одновременно выполняемых обещаний - PullRequest
0 голосов
/ 17 января 2019

У меня есть этот асинхронный вызов Waterline внутри вспомогательной функции answerUserTag:

theQuestion = await UserTag.findOne({id: answerObject.tag});

Вот как я называю вышеупомянутого помощника:

const promises = userTagAnswers.map(userTagAnswer =>
  sails.helpers.answerUserTag.with(
    {
      userTagAnswer: userTagAnswer,
      answeringUserId: inputs.userId,
      userType: inputs.userType
    }));

await Promise.all(promises);

Если есть только один userTagAnswers (то есть одно обещание), он работает нормально. Но если есть два userTagAnswers, и я установил точку останова после запроса theQuestion в помощнике, я вижу следующие бессмысленные значения:

answerObject.tag равно 5c338ae267a1983e84340388

theQuestion.id равно 5c27227ac1e60913703f3002

Кажется, что нелогичное совпадение между переменными при вызове нескольких обещаний.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Неустойчивые результаты объясняются тем, что обещания разрешаются асинхронно

это может помочь: toniov.github.io/p-iteration

0 голосов
/ 17 января 2019

Попробуйте отладить через Promise.each() что ли? Поскольку итерация последовательная, вы будете знать, какой Promise вас беспокоит.

Во-вторых, было бы здорово, если бы вы указали вспомогательную функцию.

В-третьих, почему with? Если вы проверяете MDN - с , в нем четко указывается , и я цитирую :

Использование оператора with не рекомендуется, так как это может быть источником запутанных ошибок и проблем совместимости. Это имеет противоречие с двусмысленностью. Оператор with затрудняет для читателя или компилятора JavaScript решение о том, будет ли найдено неквалифицированное имя в цепочке областей действия, и если да, то в каком объекте.

...