首页 > 解决方案 > 无法解决承诺

问题描述

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

说价值是一个承诺而不是一个数字。我认为 await 可以解决这个问题。

标签: javascriptpromise

解决方案


异步函数返回一个Promise 对象,该对象最终将由执行函数体时提供的返回值解析 - 通过执行 return 语句或通过执行函数体中的最后一条语句并返回undefined

异步函数等待async函数内部的异步操作完成。这样调用异步函数的代码就可以完成并返回事件循环——从而允许任何未完成的或新启动的异步操作继续进行。

await运算符调用其then操作数承诺,存储函数的执行上下文,返回到任务管理器,由then它提供的处理程序回调,恢复保存的执行上下文并返回其操作数的实现值作为操作的结果await。由于then回调的使用,await操作永远不会被同步评估。

所以

var port = get_port();

返回一个用端口号解析的承诺。如果未在异步函数中调用它,请使用then处理程序获取端口号:

var port = get_port();
port.then( port=> server.listen(port));


发布的代码显示了创建一个总是被另一个承诺解决或拒绝的承诺的反模式 - 只需返回另一个承诺 - 如果你总是从一个async没有await使用的函数返回一个承诺,它不需要是一个async函数第一名。


推荐阅读