首页 > 解决方案 > 异步/等待未分配的对象

问题描述

我有一个未分配给对象的 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 } ]

什么?我的电话是显示在 console.log 中工作的Object['newKey'] = await fsPromise.readFile(yadayada)地方。await fsPromise.readFile(yadayada)为什么我不能这样做,这没有意义。

标签: javascriptnode.jsmongooseproperties

解决方案


我刚刚做了一个小测试,如果在您的情况下您尝试获取“数据”属性进行打印,您似乎应该能够看到输出:

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

但是,除非您在 TempPost 的 mongoose Schema 中定义了该键,否则尝试console.log(tempPost)不会显示data

如果您想将 tempPost 操作为纯 javascript 对象,您需要通过调用将 tempPost 模型文档转换为纯 JavaScript 对象toObject,例如。tempPost = tempPost.toObject();在此之后,您console.log('after assignment and value of tempPosts in asyncForEach: ', tempPosts)将给出预期的结果。

所以这与异步/等待和分配无关,imo


推荐阅读