首页 > 解决方案 > 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

感谢您的任何帮助!基督教

标签: javascriptnode.jspromise

解决方案


您的代码中有几个问题:

  1. 您没有解决step1(),step2()和中的承诺step3()
  2. .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

推荐阅读