使用Promise在后台执行长任务

时间:2017-06-11 12:02:22

标签: typescript

在我的angular2应用程序中,我有一个可能需要很长时间的方法,因此我使用promise异步执行它。 我希望计算在后台,因此GUI将继续照常工作,但似乎我的GUI等待计算完成。

服务中的方法'func' -

return new Promise((resolve,reject) => {
            console.log("2");
            //some long process in database
            console.log("3");
            if(result!=null){
                resolve(result);
            }
            else{
                reject("Failure");
            }
}); 

我在组件中使用此方法 -

   this.service.func().then(data => {
            console.log("4");
   });
   console.log("done"); 

当前输出 -
2
3
做过
4个

期望的输出 -
做过
2
3
4个

我错过了什么?如何使用promise在后​​台执行长任务?

2 个答案:

答案 0 :(得分:0)

Promise的内容本身并不是异步,承诺将确保如果有像http请求那样的异步调用,只要使用某些数据调用resolve,它就会调用then回调函数。 但如果你只是运行一个console.log它会同步运行。 尝试运行此代码以获得您期望的结果:

return new Promise((resolve, reject) => {
        setTimeout(function() {
          console.log("2");
          console.log("3");
          resolve();
        }, 0);
  });

答案 1 :(得分:0)

您缺少的是您的承诺中没有长期运行的任务,如Web服务调用。所以,你的Promise会立即解决,这就是为什么你看到控制台按顺序登录的原因。

如果您想查看所需的行为,请使用此类setTimeout在Promise中模拟长时间运行的任务。

return new Promise((resolve,reject) => {
      // Simulate long running process with 2 second delay
      setTimeout(function () {
        console.log("2");
        console.log("3");
        resolve();
      }, 2000);
});