Javascript 异步函数 returns [对象承诺]
Javascript async function returns [object Promise]
Async
函数 returns [object Promise]
但所需的行为正在返回实际值。
我可以从 console.log
.
中获取值
我想这是该函数的预期行为,但我不知道如何修复我的代码。
这是使用 electron-vue 和 NeDB 的 vue.js 代码。
<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)
returns 数组和 console.log('result_firstname', res[0].firstName)
returns 字符串。
我已将调用代码从 {{ testNedb3('NDId6sekw6VYLmnc') }}
更改为 {{ {{ testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}
,但结果是一样的。
也更改为 {{ await testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}
但我收到错误 "Parsing error: Cannot use keyword 'await' outside an async function."。
任何评论都可以帮助我。
谢谢。
不要在视图中调用异步方法。
当您将方法标记为异步时,它将 return 一个承诺,因此,return 一个承诺并同时将其标记为异步是没有意义的。
您应该等待来自 created or some other suitable lifecycle hook 的异步方法或承诺,并将结果保存在组件的数据中,然后呈现该数据。
另外,看看 vue-promised 插件。
Async
函数 returns [object Promise]
但所需的行为正在返回实际值。
我可以从 console.log
.
我想这是该函数的预期行为,但我不知道如何修复我的代码。
这是使用 electron-vue 和 NeDB 的 vue.js 代码。
<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)
returns 数组和 console.log('result_firstname', res[0].firstName)
returns 字符串。
我已将调用代码从 {{ testNedb3('NDId6sekw6VYLmnc') }}
更改为 {{ {{ testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}
,但结果是一样的。
也更改为 {{ await testNedb3('NDId6sekw6VYLmnc').then(value => {return value}) }}
但我收到错误 "Parsing error: Cannot use keyword 'await' outside an async function."。
任何评论都可以帮助我。 谢谢。
不要在视图中调用异步方法。
当您将方法标记为异步时,它将 return 一个承诺,因此,return 一个承诺并同时将其标记为异步是没有意义的。
您应该等待来自 created or some other suitable lifecycle hook 的异步方法或承诺,并将结果保存在组件的数据中,然后呈现该数据。
另外,看看 vue-promised 插件。