如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js
Posted
技术标签:
【中文标题】如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js【英文标题】:How could I return an array from my module to my API using promise? Async Functions and Promise - Node.js 【发布时间】:2018-08-05 21:35:47 【问题描述】:我需要将一个 json 对象返回给我的 api。为此,我有一个执行一些请求并应返回结果的模块。 我的问题是掌握 Promise 概念并实施它。
server.js
app.get('/users', function(req, res)
request.getUsers()
.then(function(users)
console.log(users);
res.contentType('application/json');
res.send(JSON.stringify(users));
)
.catch(function()
console.log(users);
);
);
模块.js
exports.getUsers = function()
var params = search_string:"";
var users = [];
return new Promise(function(resolve, reject)
var result = connection.Users.get(params, function(error,response)
var user = [];
for(let i = 0; i < response.data.length; i++)
user = response.data;
users.push(user);
);
if(result != null)
console.log(result);
resolve(result);
else
reject(new Error('Try Again'));
);
当我运行服务器时,我得到 typeError: Expecting a function but got [object object]
我并没有真正明白哪里出了问题。
如何使用 Promise 从我的模块返回一个数组到我的 API?
编辑:
app.get('/users', function(req, res)
request.getUsers()
.then(function(users)
console.log(users);
res.contentType('application/json');
res.send(JSON.stringify(users));
)
.catch(function()
console.log("not resolved");
);
);
我现在的问题实际上是在 /users 端点发出任何请求之前我就得到了 .catch,我不知道为什么。
【问题讨论】:
能否请您缩进您的代码以便我们理解? 请在“模块”中间添加完整的代码文件,谁导入了什么,什么是“连接”。向我们展示完整的上下文 什么是connection.Users.get
?你确定它会返回结果吗?
这是我对外部 api 的调用。它有效,但我的问题是管理承诺,所以它会在呼叫准备好时返回用户。
@Fix3r 我已经编辑了我的答案来解决你的第二个问题
【参考方案1】:
在 module.js 中,您使用了 new Promise()
构造函数,但输入参数应该是函数而不是对象,因此要修复该用法:
return new Promise(function(resolve, reject)
var result = connection.Users.get(params, function(error,response)
...
);
注意不是new Promise(function(...)
,而是new Promise(function(...)) ...
在这里阅读更多: https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise
编辑: 我已修改您的代码以解决第二个问题:
exports.getUsers = function()
var params = search_string:"";
var users = [];
return new Promise(function(resolve, reject)
var result = connection.Users.get(params, function(error,response)
if(error || !response)
// report error
reject(new Error('Try Again'));
else
//process response
var user = [];
for(let i = 0; i < response.data.length; i++)
user = response.data;
users.push(user);
// report success
resolve(users);
);
您需要在connection.Users.get(params, function(error,response)
内调用resolve
或reject
【讨论】:
我做到了,但我遇到了另一个问题。在 server.js 上,它说未定义用户。 request.getUsers() .then(function(users) console.log(users); res.contentType('application/json'); res.send(JSON.stringify(users)); ) server.js catch 语句应该是这样的:.catch(function(err) console.log(err); );
而不是打印用户
啊好的,现在我明白了。也感谢您的链接。我不仅要让它发挥作用,还要真正了解正在发生的事情。我很感激,谢谢。
太好了,Promise 可能很难理解,但非常有用【参考方案2】:
如下修改您的module.js
代码。你传递的是一个对象而不是一个函数。
register.getUsers = function ()
var params = search_string: "" ;
var users = [];
return new Promise(function (resolve, reject)
var result = connection.Users.get(params, function (error, response)
var user = [];
for (let i = 0; i < response.data.length; i++)
user = response.data;
users.push( user );
);
if (result != null)
console.log(result);
resolve(result);
else
reject(new Error('Try Again'));
);
;
【讨论】:
这完全忽略了users
,并且总是立即解决而不等待异步回调。
就是现在出现的问题。
原因是connection.Users.get(params, function (error, response)
是一个异步调用,不会等待回调中的内容。尝试使用 Promise 执行此 response
数组,并在 .then()
中处理您的已解决状态,并在 .catch()
函数中拒绝状态。【参考方案3】:
您将用户变量声明为数组并且在 for 循环内没有用,因为用户变量始终等于 response.data 如果 response.data 是 JSON 对象数组,您可以将其推送到循环内的用户数组
for (let i = 0; i < response.data.length; i++)
users.push(response.data[i]);
我猜你想返回对象数组 我还建议您使用 bluebird 模块来返回承诺 你也可以使用 Promise.mapSeries 而不是 for 循环,例如:
return Promise.mapSeries(response.data, item =>
users.push(item)
)
【讨论】:
以上是关于如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js的主要内容,如果未能解决你的问题,请参考以下文章
如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?
如何将链式 Promise 与数组的 for 循环一起使用?