即使使用 Await,Promise 也会不断返回 Undefined
Posted
技术标签:
【中文标题】即使使用 Await,Promise 也会不断返回 Undefined【英文标题】:Promise keeps returning Undefined even using Await 【发布时间】:2022-01-22 13:59:08 【问题描述】:我对 Node.Js 有点陌生,我正在尝试为我的 WhatsApp 组制作一个与 Spotify 集成的聊天机器人(我为此使用了 wa-automate 和 spotify-web-api-node),我做了每个命令的服务层和用于搜索专辑、曲目等的 Spotify 存储库,但是当我尝试读取 getAlbumByName 返回的 albumList 时,它总是未定义,即使当我使用 console.log() 打印它时它工作得很好SpotifyRepository,我已经尝试过的东西:
使用 function.then(),在其中返回然后返回函数本身,但没有成功,类似于 return function.then((result) => return result) 不在 this.spotifyApi.searchAlbums() 中使用 await 在服务层中使用 function.then() 试图在 wa-automate client.sendText() 函数之外读取值 我检查并 searchAlbums() 返回一个 Promise,它应该在等待时返回响应我怀疑在中间件中验证 SpotifyWebApi 或我围绕层组织的整个思考过程可能是问题所在。
这是我的代码:
const SpotifyRepository = require('../repositories/spotifyRepository.js');
module.exports = class command
constructor()
this.name = 'getAlbum';
this.aliases = ['getAlbum'];
this.description = '>getAlbum';
this.spotifyRepository = new SpotifyRepository();
async run(client, message, args)
let albumName = args.split(' - ')[0];
let artistName = args.split(' - ')[1];
let albumList = await this.spotifyRepository.getAlbumByName(albumName, artistName);
client.sendText(message.from, albumList.items[0]);
;
var SpotifyWebApi = require('spotify-web-api-node');
class SpotifyRepository
constructor()
this.spotifyApi = new SpotifyWebApi(
clientId: '*************************',
clientSecret: '*************************'
);
const handler =
get: function (obj, prop)
return typeof obj[prop] !== "function"
? obj[prop]
: async function (...args)
await obj.checkAuth(prop);
obj[prop].apply(obj, args);
;
,
;
return new Proxy(this, handler);
;
async checkAuth()
let token = await this.spotifyApi.clientCredentialsGrant();
this.spotifyApi.setAccessToken(token.body['access_token'])
;
async getAlbumByName(albumName, artistName)
return await this.spotifyApi.searchAlbums(albumName + ' artist:' + artistName);
;
module.exports = SpotifyRepository;
感谢您的帮助! (对不起,如果这令人困惑,英语不是我的第一语言)
【问题讨论】:
【参考方案1】:async function (...args)
await obj.checkAuth(prop);
obj[prop].apply(obj, args);
;
在代理内部,您正在制作它,因此任何尝试访问函数的人都会获得此函数。但是这个函数没有返回语句,所以它隐式地返回了一个解析为undefined
的promise。您应该添加一个 return 语句,该语句沿实际函数返回的任何内容转发:
async function (...args)
await obj.checkAuth(prop);
return obj[prop].apply(obj, args);
;
【讨论】:
以上是关于即使使用 Await,Promise 也会不断返回 Undefined的主要内容,如果未能解决你的问题,请参考以下文章
typeorm createConnection 即使在带有 PG 的 MacOS 上使用 Await 也会返回 Pending
在 Firebase Cloud Functions 中使用 async/await 时返回一个 Promise
使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise <pending> 而不是已完成