我已将库Q.js
采用到我的程序中,尝试解决代码中执行顺序的一些问题,我一般都是promises
和deferred
的新手,所以对我来说这是一个相当困难的步骤。
目前,我在Q v1
内使用ASP.NET MVC
,因此我正在使用Visual Studio 2013
。
现在,我正在做的实际代码比这更长,但我会尝试简洁,因为我经常被告知我的问题太长而且冗长。
我首先要包括q.js
和require.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.1
和2.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
文件,看起来有点像这样;
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
执行此操作。
答案 0 :(得分:1)
我认为在你的第二个代码块中你要移动2.2.2块里面的时候看到本文底部的文档 https://github.com/kriskowal/q