【发布时间】:2019-07-14 15:53:21
【问题描述】:
下面的代码有效,但没有被承诺。
const express = require('express');
function listenAndReturnServer() {
app = express();
console.log('Before listen');
const server = app.listen(8001, function() {
console.log('Now listening');
});
console.log('After listen');
return server;
}
const server = listenAndReturnServer();
console.log('Doing some stuff');
console.log(typeof(server));
它输出以下内容:
Before listen
After listen
Doing some stuff
object
Now listening
我要解决的问题是,我想用取决于正在运行的服务器的代码替换“做一些事情”日志,并且已经调用了侦听回调(打印“正在侦听”)。如您所见,在“现在收听”之前记录了“做一些事情”。 util.promisify 进来了。
我把上面的改成了下面的。
const express = require('express');
const util = require('util');
async function listenAndReturnServer() {
app = express();
console.log('Before listen');
const listenAsync = util.promisify(app.listen);
const server = await listenAsync(8001).then(() => {
console.log('Now listening');
});
console.log('After listen');
return server;
}
async function main() {
const server = await listenAndReturnServer();
console.log('Doing some stuff');
console.log(typeof(server));
}
main();
这一次,事情至少以正确的顺序登录。
Before listen
Now listening
After listen
undefined
Doing some stuff
现在有一个新问题:server 的类型未定义。我实际上需要它是原始的 Server 对象,所以我可以关闭服务器。
谁能确定这里发生了什么,以及如何获得我想要的行为?
【问题讨论】:
-
这里函数的返回值是多少?
.then(() => { console.log('Now listening'); });这就是 Promise 将要解决的问题;这就是将分配给const server -
我明白了。我是新的承诺,所以这可以解释我的全部问题。如您所见,没有返回值。我如何在您发布的代码 sn-p 中的未命名函数的上下文中获取原始 app.listen 的返回值?这是传递给 then() 的参数吗?
-
一种方法是
.then((value) => { console.log('Now listening'); return value });。一些 Promise 库提供了一个函数来挂钩到 Promise 链而不会中断/更改它,例如 Bluebird#tap()。但是,海事组织。对于这种情况,您已经从下面的 broofa 那里得到了最佳答案。 -
@Thomas 我试过了,
value未定义。 -
这听起来好像出了点问题:
util.promisify(app.listen);答案中的代码似乎有同样的问题这一事实只是鼓励了这种假设。我最好的猜测是this不见了,但我现在没有时间检查。试试util.promisify(app.listen.bind(app))或await listenAsync.call(app, 8001)(不在一起)
标签: javascript node.js express asynchronous promise