无法解决承诺

时间:2018-05-23 23:15:40

标签: javascript promise

我试图通过等待解决一个承诺,所以我可以继续没有一个巨大的嵌套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);

说价值是承诺而不是数字。我以为等待处理了。

2 个答案:

答案 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变成同步代码;它只是将异步代码的不同位排在一起的便捷方式。仍然需要等待异步函数或链接.thenget_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