javascript - 无法解决承诺
问题描述
我试图通过等待来解决一个承诺,所以我可以在没有巨大的嵌套 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 可以解决这个问题。
解决方案
异步函数返回一个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
函数第一名。
推荐阅读
- hibernate - @MapKeyJoinColumn 在映射表中显示为空
- amazon-redshift - 基于年份的查询的数据准备
- lc3 - 为什么这会给我一个非法操作数错误?
- swift - iOS14 HLS 音频流未在元数据(ID3 标签)中快速拉出用户定义的 URL 链接
- c - 为什么 kill 函数手册页显示两个标题 sys/types.h 和 signal.h
- android - 如何在 Kotlin android 活动类中跨函数使用绑定对象
- c++ - 向无序列表的每一项添加整数
- excel - 将文件列表从多个文件夹复制到一个目标文件夹
- django - 在 FormVIew 的 get_intial() 和 get_form_kwargs() 中使用来自 GET 请求的数据
- javascript - 如何将数据(歌曲的当前时间和持续时间)推送到 redux 状态?