javascript - javascript ES6 / 如何正确链接 Promises 并实现处理
问题描述
我编写了一个类来捕获通过 vi https 访问的微服务。已经在异步方法中实现了几个调用,它们都可以自己正常工作(这里:step1()、step2()、step3())。
但是我想连续调用其中的一些(run())来实现某些工作流程。
到目前为止,我无法管理的是 stepX 方法被一个接一个地调用。此外,我想调用 run() 并得到一个承诺,这样我就可以 .then() 完成所有操作。此外,我想在那里实现一些错误处理,以捕获链中可能发生的所有错误。
这是一个将我的问题减少到核心的课程:
class Foo {
run() {
return this.step1()
.then(() => this.step2())
.then(() => this.step3())
}
step1() {
console.log('1')
return new Promise(function(resolve) {
setTimeout(function(){console.log('2')}, 500)
});
}
step2() {
console.log('3')
return new Promise(function(resolve) {
setTimeout(function(){console.log('4')}, 500)
});
}
step3() {
console.log('5')
return new Promise(function(resolve) {
setTimeout(function(){console.log('6')}, 500)
});
}
}
let bar = new Foo();
bar.run()
.then(console.log('7')) // react on run() finishing successfully
.catch(err => console.log('err:', err)) // global error handling
我希望这能以正确的顺序输出数字 1 到 7。但是当前的输出是
1
7
2
感谢您的任何帮助!基督教
解决方案
您的代码中有几个问题:
- 您没有解决
step1()
,step2()
和中的承诺step3()
。 .then(console.log('7'))
立即致电console.log()
而不是等待承诺。您必须将回调传递给.then()
.
解决了这两个问题后,您可以在代码段中运行以下生成的代码并查看所需的输出:
class Foo {
run() {
return this.step1()
.then(() => this.step2())
.then(() => this.step3())
}
step1() {
console.log('1')
return new Promise(function(resolve) {
setTimeout(function() {
console.log('2');
resolve();
}, 500)
});
}
step2() {
console.log('3')
return new Promise(function(resolve) {
setTimeout(function() {
console.log('4');
resolve();
}, 500)
});
}
step3() {
console.log('5')
return new Promise(function(resolve) {
setTimeout(function() {
console.log('6');
resolve();
}, 500)
});
}
}
let bar = new Foo();
bar.run()
.then(() => console.log('7')) // react on run() finishing successfully
.catch(err => console.log('err:', err)) // global error handling
这会生成输出:
1
2
3
4
5
6
7
推荐阅读
- c# - Mocking MongoDb 方法,例如 Xunit 中的 Find、FindAsync 方法
- python - 布尔值的解释——在未排序的数组中找到第 K 个最大的元素
- ember.js - uniq() 返回重复记录
- wordpress - Dockerfile:尽管使用了`COPY --chown=`,但目录所有权问题
- ebpf - 在内核空间中使用 eBPF map 进行比较
- alexa - 如何调试 sef-hosted 的 alexa 技能?
- typo3 - 可以一键打开TYPO3中的页面树吗?
- javascript - WebRTC 的 Youtube 直播 API
- typescript - 联合中不存在 Typescript 属性
- javascript - p5 js 输入在移动设备上不起作用