javascript - JS:从异步函数提前触发返回的承诺
问题描述
我创建了一些包含 Promises 的函数并尝试将它们链接起来。一切都按预期工作
function foo1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("11111")
resolve()
}, 4000);
}).then(() => {
console.log("222222")
})
}
function foo2() {
new Promise(resolve => {
setTimeout(() => {
console.log("3333")
resolve()
}, 3000)
})
}
foo1().then(() => foo2())
// "1111"
// "2222"
// "3333"
如果我将相同的东西放在异步/等待中,它也会按预期工作:
async function testAsync() {
let one = await foo1();
let two = await foo2();
}
// "1111"
// "2222"
// "3333"
我知道异步函数会返回一个 Promise,所以我尝试了以下方法:
testAsync().then(() => {
console.log("FINISHED");
})
但结果是:
// "1111"
// "2222"
// "FINISHED"
// "3333"
为什么会"FINISHED"
提前执行"3333"
?
解决方案
你的foo2
函数不返回 Promise,只返回 undefined。
这就是为什么您在“3333”之前看到“FINISHED”的原因
如果foo2
如下所示,它将按您的意愿工作。
function foo2() {
return new Promise(resolve => {
setTimeout(() => {
console.log("3333")
resolve()
}, 3000)
})
}
推荐阅读
- javascript - 如何从 google-api 获取完美的数据
- mysql - 插入到带有外部键引用的选择中
- c - Typedef 结构、指针和将指针传递给函数
- android - Geckoview (Firefox webview) Gradle 冲突问题(棒棒糖版)
- python - Python Django 网站无法识别 css 更改
- react-native - 从我们离开的地方开始视频
- r - R中具有潜在变量的状态空间模型
- docker - Docker swarm 和 cloudflare dns
- javascript - 我可以使用 orderBychild("person").limitToLast(1) 来获取具有属性“person”的最后一条记录吗?
- flutter - 如何在颤振中使用 dart.core.sink