【问题标题】:How to ensure execution order in TypeScript如何确保 TypeScript 中的执行顺序
【发布时间】:2019-05-24 08:25:45
【问题描述】:

当我最终在 typescript 中遇到关于执行顺序的问题时,我正在尝试实现一些功能:

代码:

new Promise((resolve) => {
          setTimeout(()=>{
            console.log("function11111");
            resolve();
          }
          ,3000);      
          
        })
        .then(_=>{
          setTimeout(()=>{
            console.log("function22222");
          }
          ,2000);   
        })
        .then(_=>{
          setTimeout(()=>{
            console.log("function3333333");
          }
          ,1000);   
        }) 

输出:

function11111
function33333
function22222

我的问题是:

1)对于function1111,如果我们用一个需要几秒钟的函数替换这个console.log('fucntion1111'),在这种情况下,我的代码将在函数完成执行之前触发resolve(),那么如何确保等待我的功能

2)然后在我的代码中,为什么执行不尊重我的订单?我在想,promise 就是为此目的而创建的。

【问题讨论】:

  • 执行确实遵守由 Promise 管理的代码顺序,但每个回调都会创建一个新的异步进程,不是由 Promise 管理。
  • setTimeout 不返回 Promise。它会立即返回一个整数,因此.then() 会立即执行。 (You can make it return a Promise, though)。在您的“真实世界”代码中,确保在每个 .then() 中返回一个 Promise

标签: javascript typescript promise es6-promise


【解决方案1】:

问题是一旦调用了初始的resolve(),所有then 处理程序都会同时被调用。而且由于每个都有不同的超时,因此输出顺序为function33333 and then functon2222

要维持订单,您可以执行承诺链,等待前一个 promise 得到解决,然后再调用下一个 then() 块。

我已经把承诺锁起来了。如果您需要更多说明,请告诉我。

new Promise((resolve) => {
      setTimeout(()=>{
        console.log("function11111");
        resolve();
      }
      ,3000);

    })
    .then(_=> new Promise(resolve => {
      setTimeout(()=>{
        console.log("function22222");
        resolve();
      }
      ,2000);
      })
    )
    .then(_=> new Promise(resolve => {
      setTimeout(()=>{
        console.log("function3333333");
        resolve();
      }
      ,1000);
      })
    );

【讨论】:

  • 太好了!!!第一个问题?我应该在我的 function111 中实现一个 Promise 以确保执行将等到它完成?
  • 第一个已经自己解决了一个承诺。 new Promise 实际上是在第一个 Promise 的 resolve() 部分之后触发 then。
  • 如果此答案对您有所帮助并且您没有其他说明,您可以将其标记为已接受@karim Garali
猜你喜欢
  • 2019-08-19
  • 2016-08-06
  • 2021-12-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
相关资源
最近更新 更多