- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,异步函数将它们的返回值隐式包装到一个 promise 中。这确实适用于每个属性,除了 Promises 本身。
async function f() {
return new Promise((res) => {
setTimeout(() => {
res("Why am I being unwrapped")
}, 1000)
})
}
(async () => {
console.log(await f())
})()
那些在返回之前会被打开。所以 await f()
实际上等待两个嵌套的 promise。
Note that this also works with explicitly createded Promises (
Promise.resolve(new Promise(...))
)
是否有好的方法来避免这种情况?我真的很想有一个没有像这样的 quickfix 的嵌套 Promise。
async function y() {
return {wrapped: new Promise((res) => {
setTimeout(() => {
res("Why am I being unwrapped")
}, 1000)
})}
}
(async () => {
console.log((await y()).wrapped)
})()
最佳答案
根据 MDN documentation on async
functions :
Async functions always return a promise. If the return value of an async function is not explicitly a promise, it will be implicitly wrapped in a promise.
换句话说,由于您要返回一个 Promise,因此它不会被包装。如果你想重新包装它,你可以,但你也可以去除具有类似效果的 async
关键字。 除非您await
它,否则您会得到原始的 Promise。
如此有效:
function f() {
return new Promise((res) => {
setTimeout(() => {
res("Might be wrappers on some of you, but not on me!")
}, 1000)
})
}
(async () => {
console.log(f())
})()
它给你这样的输出:
Promise { <pending> }
如果目标是拥有一个返回原始 Promise 的 Promise,那么您将与 Promise 系统设计的所有功能作斗争,即在发现 Promise 时自动解包。 Promise.resolve()
包装所有但 Promise,如果您以某种方式给它一个 Promise,它会递归地解包。
你可以通过返回一些不是 Promise 的东西来做到这一点,就像你的例子一样,但这似乎违背了 Promises 的全部目的。
如果你有一个特定的问题,你试图解决它绝对需要一个延迟的 promise ,考虑返回一个函数而不是一些任意对象:
function f() {
return () => {
return new Promise((res) => {
setTimeout(() => {
res("I'll start as soon as you ask.")
}, 1000)
})
};
}
然后您可以调用 let p = f()
,然后在您想要获得实际 Promise 时调用 p()
。这就是 JavaScript 通常处理延迟执行的方式。
如果您想立即启动对 Promise 的执行,您仍然可以适应:
function f() {
const p = new Promise((res) => {
setTimeout(() => {
res("Already underway when requested.")
}, 1000)
})
return () => { p };
}
尽管通常最好尽可能避免使用这些技术,而且通常是这样。
关于javascript - JS : async function implicitly unwraps promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61762358/
func initializePickerViewProperties() { let font = UIFont (name: "SanFranciscoDisplay-Regular",
我试图将预先附加的字符串作为 URL 请求传递,但我不断收到错误消息: fatal error :在展开可选值时意外发现 nil 此错误指向行:let searchTerm = "http://goo
我有一个像这样的html结构 旁边的两个 div 确实有类和子元素,但为了这个问题,您不需要知道它们是什么。在 DOM 准备就绪后,我将两个内部 div 包裹在一个新的 div 中,就
显然是我的语法错误。 我有大量的 div,其中少量的内容包含在 anchor 中。我要做的是移除 anchor 。 感谢您的帮助! http://jsfiddle.net/danielredwood/
关闭。这个问题是 opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 已关闭 2 年前。 奥 git _
我已经包装了阶段,我想使用“wrap”函数来打开它们。但是,在这种情况下,由于我不清楚的原因,我无法获得展开的相位。 包裹的阶段是 通过观察横截面,我可以看到相被包裹 我已将图像从 0 缩放到 2*p
用 jQuery 包装 div 后,展开它们然后尝试再次包装它们似乎会丢失 float 属性(我的猜测),我不知道如何解决这个问题。 当第一次按下 JSFiddle 中的换行按钮时,它会像我期望的那样
我将容器 .vorteile 通过 jQuery 包装在 .vorteile_outer 中。当我想在 .vorteile 上使用 .unwrap() 删除 .vorteile_outer 时,.vo
这个问题已经有答案了: jQuery : remove element except inside element (4 个回答) 已关闭 9 年前。 jquery中有一个很棒的方法叫做wrap()它
这个问题已经有答案了: jQuery : remove element except inside element (4 个回答) 已关闭 9 年前。 我有一段 HTML 代码: table 我如何从
当用户提交或聚焦无效输入时,我有一个包含在错误 div 中的文本字段。如果用户纠正了错误,我想删除包装器,但是,unwrap() 方法会导致字段失去焦点。 $(special_input).live(
我正在寻找一种方法来“解开”已发布到 MVC 核心服务的 JSON。比方说,我有以下方法: [HttpPost] public dynamic SayHello(string First
我引用了以下网页: https://serverfault.com/questions/153983/sockets-found-by-lsof-but-not-by-netstat 使用Python
我有一个 jQuery 突出显示工具,它可以动态地将一个类添加到一个字符串中。如果一个元素包含单词 Hello World 并且用户搜索'ell',它为单词添加了一个跨度 Hello world 要重
如何在 Iframe 中展开 span 标签。 Directional 我尝试使用此删除 $('iframe').contents().find(".newtext").unwrap(); 如果 re
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 4 年前。 Improve
在我的代码中,我有很多带有 Option 的结构在他们里面。我需要在很多地方与他们一起工作,所以我的代码中充斥着像 car.engine.as_ref().unwrap() 这样的结构访问。 .这对代
这个问题在这里已经有了答案: Unable to read file contents to string - Result does not implement any method in sco
出于某种原因,Rust 编译器提示 Result 没有实现 unwrap,即使我提供的错误类型确实实现了 Debug。下面提供了出错的代码。 use std::fmt::{Display, Debug
多么奇怪的错误: use std::collections::BTreeMap; struct MyStruct1; struct Error; fn get_res() -> Result), Er
我是一名优秀的程序员,十分优秀!