0

我有以下 durendal 代码:

var variable = ko.observable("");
function activate(){
   return myModel.doSomething(variable);
}

doSomething定义如下:

function doSomething(variable){
    if(someCondition)
       return $.ajax(...).success(function(data){variable(data)});
    variable(defaultValue);
    return defaultValue;
}

someCondition==true当使用 ajax 调用结果初始化变量时,此代码工作正常。当someCondition==falseactivate 方法返回而变量未初始化时。

从我在文档中读到的内容来看,快乐的道路是有效的,因为 ajax 调用返回了一个承诺,但不是这种else情况。

我试过这个:

function activate(){
   return myModel.doSomething(variable).promise();
}

但我收到一个错误,说可观察对象没有promise有意义的方法。

问题 如何让else子句像 ajax 调用一样返回一个承诺?

4

1 回答 1

1

您应该更好地将逻辑封装在doSomething函数内部,因此它始终返回一个承诺。您可以使用system.defer来自 Durandal 的来实现此目的:

var system = require('durandal/system');

function doSomething(){
       return system.defer(function(dfd){
            if (someCondition)
                return $.ajax(...).then(function (res) {
                    dfd.resolve(res);
                });
            else
                dfd.resolve(defaultValue);
        }).promise();
}

然后在您的激活中:

function activate(){
   return myModel.doSomething().then(function(res){
         variable(res);
     });
}

请注意,要更新的变量没有传递给函数的记录器。承诺将始终返回一个值,无论是来自 AJAX 调用还是默认值。

于 2013-09-10T14:53:31.650 回答