Асинхронная функция Javascript возвращает [Promise объекта] - PullRequest
0 голосов
/ 09 июня 2019

Async функция возвращает [object Promise], но желаемое поведение возвращает реальное значение. Я могу получить значение от console.log.

Я предполагаю, что это ожидаемое поведение функции, но я не знаю, как исправить мой код.

Это в коде vue.js с использованием Electron-Vue и NeDB.

<template>
  <div>
    {{ testNedb3('NDId6sekw6VYLmnc')  //this is a test by adding specific id }}
  </div>
</template>

<script>
import Promise from 'bluebird'
export default {
  methods: {
    dbFindAsync2: function (db, opt) {
      return new Promise(function (resolve, reject) {
        db.find(opt, function (err, doc) {
          if (err) {
            reject(err)
          } else {
            resolve(doc)
          }
        })
      })
    },
    testNedb3: async function (id) {
      const flattenMemAsync = function (arr) {
        return new Promise(function (resolve) {
          Array.prototype.concat.apply(
            [],
            arr.map(function (arr) {
              resolve(arr.members)
            })
          )
        })
      }
      const filterByNameIdAsnc = function (arr) {
        return new Promise(function (resolve) {
          const result = arr.filter(function (member) {
            return member.nameId === id
          })
          resolve(result)
        })
      }
      this.dbFindAsync2(
        this.$db, { 'members.nameId': id }, { 'members': 1, _id: 0 }
      ).then(function (res) {
        const docs = res
        flattenMemAsync(docs).then(function (res) {
          const flatMembers = res
          filterByNameIdAsnc(flatMembers).then(function (res) {
            console.log('result', res)
            console.log('result_firstname', res[0].firstName)
            return res
          })
        })
      })
    },

this.$db получает данные из NeDB, и данные представляют собой двумерный массив, поэтому я пытаюсь выровнять массив по flattenMemAsync и удалить неожиданные данные по filterByNameIdAsnc.

console.log('result', res) возвращает массив, а console.log('result_firstname', res[0].firstName) возвращает строку.

Я изменил код вызова с {{ testNedb3('NDId6sekw6VYLmnc') }} на {{ {{ testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}, но результат тот же.

Также изменен на {{ await testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}, но я получил ошибку «Ошибка синтаксического анализа: невозможно использовать ключевое слово« await »вне асинхронной функции.».

Любой комментарий может помочь мне. Спасибо.

1 Ответ

2 голосов
/ 09 июня 2019

Не вызывайте асинхронный метод в представлении.

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

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

Также взгляните на vue-обещанный плагин.

...