gpt4 book ai didi

javascript - Q.js 和 ASP.NET MVC 中的执行顺序困惑

转载 作者:行者123 更新时间:2023-12-03 12:20:08 25 4
gpt4 key购买 nike

我已经采用了库Q.js进入我的程序尝试解决代码中执行顺序的一些问题,我是 promises 的新手和deferred总的来说,这对我来说是相当困难的一步。

此时,我正在使用 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.32.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文件看起来有点像这样;

home/app/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 执行此操作的正确方法.

最佳答案

2.1 将在 2.2 之前运行,因为这是您运行代码的顺序,但 2.2 代码是异步运行的,因此一旦 require 得到所有内容,就会运行,这将比执行 2.3 代码花费更多的时间

我认为在你的第二个代码块中,你想将 2.2.2 block 移动到when中,请参阅本页底部的when文档 https://github.com/kriskowal/q

关于javascript - Q.js 和 ASP.NET MVC 中的执行顺序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com