Асинхронизация / ожидание объекта, не назначаемого - PullRequest
1 голос
/ 15 марта 2019

У меня есть функция async / await, которая не присваивает объекту, и я не знаю почему. Я утешаю результаты, и они кажутся кошерными, но когда они достигают фактического назначения объекта, они не присваиваются. Я объясню ниже:

Так вот код:

Это просто вспомогательная функция для asyncForEach:

  async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index++) {
      await callback(array[index], index, array);
    }
  }

Тогда у меня есть следующее:

const asyncFunc = async () => {
  await asyncForEach(tempPosts, async (tempPost) => {
    if (tempPost.fileName!=''){

      console.log('tempPosts[tempPosts.indexOf(tempPost)]: ',
      tempPosts[tempPosts.indexOf(tempPost)])

      console.log("await fsPromise.readFile(__dirname+'/../picFolder/sharp/'+tempPost.fileName)", 
      await fsPromise.readFile(__dirname+'/../picFolder/sharp                
      /'+tempPost.fileName))

      tempPosts[tempPosts.indexOf(tempPost)]['data'] = 
      await fsPromise.readFile(__dirname+'/../picFolder/sharp/'+tempPost.fileName)

      console.log('after assignment and value of tempPosts in asyncForEach: ', tempPosts)
    }
  })
}

Итак, вот результаты трех журналов javascript:

console.log('tempPosts[tempPosts.indexOf(tempPost)]: ',
tempPosts[tempPosts.indexOf(tempPost)])

Результаты в

tempPosts[tempPosts.indexOf(tempPost)]:  { flags: 0,
  fileName: '1552601360288&&travelmodal.png',
  comments: [],
  _id: 5c8ad110ef45f6e51a323a18,
  body: 'asdasdfasdf',
  created: 2019-03-14T22:09:20.427Z,
  __v: 0 }

Что представляется правильным.

И

console.log("await fsPromise.readFile(__dirname+'/../picFolder/sharp/'+tempPost.fileName)", 
await fsPromise.readFile(__dirname+'/../picFolder/sharp                
  /'+tempPost.fileName))

Дает ...

await fsPromise.readFile(__dirname+'/../picFolder/sharp/'+tempPost.fileName)
<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 c8 00 00 00 62 08 06 00 00 00 15 df 9c 16 00 00 00 09 70 48 59 73 00 00 16 25 00 00 16 25 01 ... >

Какая действительно длинная строка буфера данных мне нужна. Круто.

ОДНАКО

after assignment and value of tempPosts in asyncForEach:  [ { flags: 0,
    fileName: '1552601360288&&travelmodal.png',
    comments: [],
    _id: 5c8ad110ef45f6e51a323a18,
    body: 'asdasdfasdf',
    created: 2019-03-14T22:09:20.427Z,
    __v: 0 },
  { flags: 0,
    fileName: '1552601320137&&Screen Shot 2019-03-09 at 10.03.09 AM.png',
    comments: [],
    _id: 5c8ad0e8ef45f6e51a323a17,
    body: 'adf',
    created: 2019-03-14T22:08:40.336Z,
    __v: 0 } ]

Что? Мой вызов Object['newKey'] = await fsPromise.readFile(yadayada), где await fsPromise.readFile(yadayada) показано для работы в console.log. Почему я не могу этого сделать, это не имеет смысла.

1 Ответ

1 голос
/ 15 марта 2019

Я только что провел небольшой тест, и, похоже, вы сможете увидеть вывод, если в вашем случае вы попытаетесь получить свойство data для печати:

console.log('after assignment and value of tempPost in asyncForEach: ',tempPosts[tempPosts.indexOf(tempPost)]['data'])

Однако при попытке console.log(tempPost) не будет отображаться data, если вы не определили этот ключ в схеме мангуста вашего TempPost

Если вы хотите манипулировать tempPost как простой объект javascript, вам необходимо преобразовать документ модели tempPost в простойОбъект JavaScript, вызывая toObject, например.tempPost = tempPost.toObject(); после этого ваш console.log('after assignment and value of tempPosts in asyncForEach: ', tempPosts) даст ожидаемый результат.

Так что это не имеет никакого отношения к асинхронному / ожиданию и присваиванию, imo

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