ASP.NET MVC中的Q.js和执行混乱的顺序

时间:2014-06-29 18:32:44

标签: javascript asp.net-mvc q

我已将库Q.js采用到我的程序中,尝试解决代码中执行顺序的一些问题,我一般都是promisesdeferred的新手,所以对我来说这是一个相当困难的步骤。

目前,我在Q v1内使用ASP.NET MVC,因此我正在使用Visual Studio 2013

现在,我正在做的实际代码比这更长,但我会尝试简洁,因为我经常被告知我的问题太长而且冗长。

我首先要包括q.jsrequire.js,这里没什么特别的。它工作正常,编译,运行,一切都很幸福。

@Scripts.Render("~/scripts/q")
@Scripts.Render("~/scripts/require")

<script type="text/javascript">
   Q().then(function(){
      // some code executes here.
      $.blockUI(); // the whole page is blocked while loading.
      console.log("[1] first step. blocking the page."); 
   }).then(function() {
      console.log("[2.1] starting the second step.");
      require(['home/app/init'], function(app) {
         console.log("[2.2] within the require function.");
         new app.init().wiring(); // this does some preliminary stuff for the app
      });
      console.log("[2.3] outside of the require function.");
   }).then(function() {
      console.log("[3.1] made it to the third step. stuff happens.");
   });
</script>

现在,运行此代码,2.12.3的控制台输出在2.2之前可见 - 这是问题的关键。我希望它按顺序运行。所以我挖了一点,找到了这个建议;我建议改变我的require电话看起来更像这样......

// ....
.then(function(){
   var promise = Q.when(require['home/app/init'], function(app) {
                    console.log("[2.2.1] within the require");
                    new app.init().wiring();
                 }).then(function() {
                    console.log("[2.2.2] I expect to see this after 2.2.1");
                 });
  console.log("[2.3] outside of the require function.");
});

现在我知道2.3仍会在2.2.1之前运行,但我仍然看到2.2.2之前2.2.1正在运行 - 而且我认为包裹行为在Q.when(fn)中应该解决这个问题吗?

有人可以帮助我理解为什么这些没有按我要求的顺序运行吗?

有关更多信息,文件home/app/init实际上是Typescript文件,看起来有点像这样;

家/应用/ init.ts

export class init {
   public function wiring() {
      // some simple things happening here, nothing special.
   }
}

我不确定这个问题是否有资格获得ASP.NET MVC标签,但我使用该框架这一事实对我使用的工具至关重要,这对我能做的事情有影响(例如,由于Visual Studio,我很难处理涉及node.js的事情 - 所以我明确标记它以确保人们意识到我所处的开发环境。

更新

我在这方面取得了一些进展,但我仍然有点不确定。目前,以下代码似乎按照我期望的顺序运行更多。

// .....
.then(function(){
   console.log("[2.1]");

   // create a deferred promise
   var deferred = Q.defer();

   require(['home/app/init'], function(app) {
      // we are inside the require function
      console.log("[2.2]");
      // run the actual method
      new app.init().wiring();
      // report back to the console.
      console.log("[2.3]");
      // resolve the promise
      deferred.resolve();
   });

   console.log("[2.4]");

   Q.when(deferred.promise).then(function() {
      console.log("[2.5]");
   }).then(function(){
      // ... continue
});

这至少会导致代码暂停并等待require完成后再继续2.5,但我不确定这是否是正确的方法使用Q.js执行此操作。

1 个答案:

答案 0 :(得分:1)

2.1将在2.2之前运行,因为这是您运行代码的顺序,但2.2代码是异步运行的,所以一旦需要按顺序运行,需要花费的时间比执行2.3代码需要的时间更长

我认为在你的第二个代码块中你要移动2.2.2块里面的时候看到本文底部的文档 https://github.com/kriskowal/q