javascript - Synchronizing flow of control after if-then-else with promises
问题描述
I have multiple scenarios where, based on a condition, I need to do asynchronous processing and later proceed regardless of the path taken. This code works as I expect:
let processingComplete = new Promise(function (resolve, reject) { }); // create pending promise
let condition = true;
var wait = function () {
return new Promise((resolve, reject) => {
setTimeout(resolve, 500);
});
}
if (condition) {
processingComplete = wait();
} else {
// do something else, synchronously
processingComplete = Promise.resolve();
}
processingComplete.then(() => {
console.log("entering processingComplete.then...")
});
However, if the promises are nested more than one deep the .then clause never fires. For example,
let processingComplete = new Promise(function (resolve, reject) { }); // create pending promise
let condition = true;
var wait = function () {
return new Promise((resolve, reject) => {
setTimeout(resolve, 500);
});
}
if (condition) {
wait()
.then(() => {
processingComplete = wait() // nesting of promises
})
} else {
// do something else, synchronously
processingComplete = Promise.resolve();
}
processingComplete.then(() => {
// this code never fires with nested promises
console.log("entering processingComplete.then...")
});
I'm certainly familiar with using promises, but I'm not understanding why this does't work. I'd welcome any insights.
解决方案
处理大量的 promise 有时会更好async / await
。processingComplete
在您的示例中,您在调用processingComplete.then(...)
. 这可能会有所帮助:
let processingComplete = new Promise(function (resolve, reject) { });
let condition = true;
var wait = function () {
return new Promise((resolve, reject) => {
setTimeout(resolve, 500);
});
}
async function run() {
if (condition) {
await wait()
processingComplete = wait()
} else {
processingComplete = Promise.resolve();
}
processingComplete.then(() => {
console.log("entering processingComplete.then...")
});
}
run()
推荐阅读
- javascript - VBscript 从 IE 元素创建对象
- typescript - 离子科尔多瓦:文件传输不工作。配置错误?
- vbscript - 使用带有 SSL 加密的 Vbscript(UFT) 的 Azure 云数据库的连接字符串
- mongodb - 无法从本地机器连接到 docker 容器中的 mongodb
- scripting - 如何轻松地将 Debian 脚本转换为 RPM 脚本?
- c++ - 为什么通用参考不保持其论点的恒定性?
- javascript - 使用 GET 方法的 ExpressJS PATCH 请求重定向
- google-cloud-platform - 在 Google Compute Engine VM 实例中使用自定义 .sh 文件安装 Odoo
- html - 有很多嵌套元素不好吗?
- python - 在 Python 中使用组合而不是继承来实现多态性的正确方法