我试图通过等待解决一个承诺,所以我可以继续没有一个巨大的嵌套clusterF。
var getPort = require('get-port');
var get_port = async function(){
var port_promise = new Promise((resolve_port) => {
getPort({port: 16100}).then(resolve_port);
});
var port = await port_promise;
return port;
};
var port = get_port();
但是,此代码会在
上引发错误server.listen(port);
说价值是承诺而不是数字。我以为等待处理了。
答案 0 :(得分:2)
异步函数返回一个 Promise对象,最终将通过执行函数体时提供的返回值来解析 - 通过执行return语句或执行body中的最后一个语句并返回{ {1}}。
异步函数不等待undefined
函数内的异步操作完成。
这样调用异步函数的代码就可以完成并返回到事件循环 - 从而允许任何未完成或新启动的异步操作继续进行。
async
运算符在其操作数promise上调用await
,存储函数的执行上下文,返回任务管理器,由它提供的then
处理程序回调,恢复保存执行上下文,并返回其操作数的已实现值作为then
操作的结果。由于await
回拨使用,then
操作从不同步评估。
所以
await
返回使用端口号解析的承诺。如果未在异步函数中调用它,请使用var port = get_port();
处理程序来获取端口号:
then
<小时/> 发布的代码显示了一个创建承诺的反模式,该承诺始终由另一个承诺解决或拒绝 - 只返回另一个承诺 - 如果您总是从
var port = get_port();
port.then( port=> server.listen(port));
函数返回一个没有async
用法的承诺,它首先不需要是await
函数。
答案 1 :(得分:0)
Await不会将你的Promise变成同步代码;它只是将异步代码的不同位排在一起的便捷方式。仍然需要等待异步函数或链接.then
。 get_port
是异步的。
const getPort = require('get-port');
async function startServer() {
// Somehow get a server
var port = await getPort({ port: 16100 });
server.listen(port);
}
// In calling code
async function someAsyncFunc {
await startServer();
}
// or startServer().then(() => { ... }); if you are outside of an async func