使用Durandal SPA我在 shell.js :
中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()无法从datacontext获得结果:
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);
});
答案 0 :(得分:2)
您可以进行的最简单的修改是使用Q
函数本身来“同化”您的getUser
函数返回的jQuery“承诺:
Q(datacontext.getUser(user)).done(function() {
return datacontext
.primeData()
.then(boot)
.fail(failedInitialization);
});
请注意,由于Q承诺链,这可以更简单:
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();