使用我的 shell.js 中的 Durandal SPA:
function activate() {
datacontext.getUser(user);
return datacontext
.primeData()
.then(boot)
.fail(failedInitialization); //return for durandal
}
boot() 函数取决于 datacontext.getUser(user) 的结果。
我想在激活之前获取用户凭据。如果 primeData() 没有做太多事情(目前):
var primeData = function() {
return Q.all([]);
};
然后 boot() 无法从数据上下文中获取结果:
var getUser = function(userObservable) {
userObservable();
var options =
{
url: 'api/user',
type: 'GET',
datatype: 'json'
};
return $.ajax(options).then(queryOk).fail(queryNotOk);
function queryOk(data) {
userObservable(model.user(data));
}
function queryNotOk(data, textStatus) {
...
}
};
问题是:如何使用 Q 代替 jQuery 的 $.when().done():
$.when(datacontext.getUser(user)).done(function() {
return datacontext
.primeData()
.then(boot)
.fail(failedInitialization);
});
最佳答案
您可以进行的最简单的修改是使用 Q
函数本身来“同化”由 getUser
函数返回的 jQuery“promise:
Q(datacontext.getUser(user)).done(function() {
return datacontext
.primeData()
.then(boot)
.fail(failedInitialization);
});
请注意,由于 Q promise 链,这可以变得更简单:
Q(datacontext.getUser(user))
.then(datacontext.primeData)
.then(boot)
.fail(failedInitialization)
.done();
一个稍微好一点的解决方案是在 getUser
函数本身内部进行同化,以便它返回一个 Q promise 而不是 jQuery“ promise ”:
function getUser(userObservable) {
userObservable();
var options = {
url: 'api/user',
type: 'GET',
datatype: 'json'
};
return Q($.ajax(options)).then(queryOk).fail(queryNotOk);
function queryOk(data) {
userObservable(model.user(data));
}
function queryNotOk(data, textStatus) {
...
}
}
datacontext.getUser(user)
.then(datacontext.primeData)
.then(boot)
.fail(failedInitialization)
.done();
关于durandal - 延迟ajax和when() did()的Q解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834229/