从异步函数中获取数据

Posted

技术标签:

【中文标题】从异步函数中获取数据【英文标题】:get data from async function 【发布时间】:2019-04-25 14:34:09 【问题描述】:

我正在尝试为我的种子箱做一个像 Sickgearr 这样的小网站: 我想要一个搜索表单,它将使用此 api 向我的 torrent 提供商发送搜索查询:https://github.com/JimmyLaurent/torrent-search-api

我设法从表单中获取文本,进行 api 调用并在控制台中打印结果。

但是当我尝试将它们传递到即将成为结果的页面时,我只是传递了 Promise,我不太了解 Promise 的原理。

如果有人可以帮助我解决我的问题,我会非常感激或至少给我一些提示!

这是我的代码,由几个 ejs、nodejs 初学者教程组成:

const express = require('express');
const bodyParser = require('body-parser');
const app = express()
const TorrentSearchApi = require('torrent-search-api');
const tableify = require('tableify');
TorrentSearchApi.enableProvider('Yggtorrent','Login', 'Password');

app.use(express.static('public'));
app.use(bodyParser.urlencoded( extended: true ));
app.set('view engine', 'ejs')

async function search(query) // Search for torrents using the api

var string = query.toLowerCase();
//console.log(string);
const torrents = await TorrentSearchApi.search(string,'All',20); // Search for legal linux distros 
return(JSON.stringify(torrents));


app.get('/', function (req, res) 
  res.render('index');
)

app.post('/', function (req, res) 
var rawTorrent = search(req.body.torrent);
var page = tableify(rawTorrent); //printing rawtorrent will only give me "promise"
res.render('results',page);
)


app.listen(3000, function () 
  console.log('Example app listening on port 3000!')
)

【问题讨论】:

您是否尝试过启用提供程序? torrentSearchApi.enableProvider('Torrent9');还是特定的提供商? 【参考方案1】:

您的搜索功能正在使用async/await。 这意味着搜索功能是异步的并返回Promise。 你应该等待它的结果(第 23 行)。

https://javascript.info/async-await

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const TorrentSearchApi = require('torrent-search-api')
const tableify = require('tableify')

TorrentSearchApi.enableProvider('Yggtorrent','Login', 'Password')

app.use(express.static('public'))
app.use(bodyParser.urlencoded( extended: true ))
app.set('view engine', 'ejs')


const search = async query => 
  const loweredQuery = query.toLowerCase()
  const torrents = await TorrentSearchApi.search(loweredQuery, 'All', 20)
  return JSON.stringify(torrents)


app.get('/', (_, res) => res.render('index'))

app.post('/', async (req, res) => 
  const torrents = await search(req.body.torrent) // Right here
  const htmlTable = tableify(torrents)
  res.render('results', htmlTable)
)

app.listen(3000, function () 
  console.log('Example app listening on port 3000!')
)

【讨论】:

非常感谢,我回家后会试试这个,如果我理解正确我会通知你我必须用 await 调用异步函数,否则承诺将无法解决? 无论哪种方式,promise 都会被解决,但如果没有“等待”,程序的执行会在解决之前恢复

以上是关于从异步函数中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

JS fetch API:如何使用一个异步函数从多个文件中获取内容?

从 useState 中的异步函数获取值

如何从对象的`get()`获取异步数据而不返回Promise

异步/等待/然后在 Dart/Flutter 中

如何在不返回 Promise 的情况下从对象的`get()` 获取异步数据

从 Nodejs 中的 mySQL 获取数据时如何从 Async/await 函数获取返回值