.then .done承诺不使用knockout和js在durandal spa工作

时间:2015-02-10 07:29:09

标签: jquery knockout.js single-page-application q durandal-2.0

我正在使用Knockout jQuery和Require开发在Durandal开发的SPA。我的问题是,当我对我的API进行ajax调用时,我实际上并没有在.then语句之外获取我的数据(当我用下面注释掉的行代替我的Get方法时)。但是,如果我使用当前调用我不能使用。然后它给我一个类型未定义的错误。我看过Durandal,他们解释了使用Q,我有它并在我的主要参考。不确定提到的补丁here

    var getSearchResult = function (dataHolder,text) {
            //return $.getJSON('/Api/Data/GetSearchItem/' + text).done();
            jQuery.support.cors = true;
            $.ajax({
                url: '/Api/Data/GetItem/' + text,
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    dataHolder(data);
                    var check = dataHolder();
                    return dataHolder();
                },
                error: function (e) {
                }
            });
        };

我这样称呼方法:

        var search = function (searchText) {
            dtx.getSearchResult(searchResult, searchText).then(function () {//(searchResult is an observableArray
                searchFlag(true);
                var test = searchResult();//i get data here
                searchTxt(searchText);
            });
            var test1 = searchResult();//no data here
        };

2 个答案:

答案 0 :(得分:3)

如果让getSearchResult返回承诺怎么办?

var getSearchResult = function (dataHolder,text) {
        //return $.getJSON('/Api/Data/GetSearchItem/' + text).done();
        jQuery.support.cors = true;
        return $.ajax({
            url: '/Api/Data/GetItem/' + text,
            type: 'GET',
            dataType: 'json'
        }).then(function(data) {
            dataHolder(data);
            var check = dataHolder();
            return dataHolder();
        });
    };

然后让search返回一些承诺:

    var search = function (searchText) {
        return dtx.getSearchResult(searchResult, searchText).then(function (data) {//(searchResult is an observableArray
            searchFlag(true);
            var test = searchResult();//i get data here
            searchTxt(searchText);
        });
    };

现在您可以按如下方式致电search

search(searchText).then(function(data) {

});

答案 1 :(得分:1)

getSearchResult不会返回承诺。所以你不能使用q.js的承诺。有两种方法可以解决这个问题。

  1. 好方法:实施自己的承诺解析器(请参阅q.js documentation Deferreds 部分是您正在寻找的部分)
  2. 快速方法:向getSearchResult功能添加回调并使用此功能:

    var getSearchResult = function (dataHolder,text, callback) {
            //return $.getJSON('/Api/Data/GetSearchItem/' + text).done();
            jQuery.support.cors = true;
            $.ajax({
                url: '/Api/Data/GetItem/' + text,
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    callback(data);
                },
                error: function (e) {
                }
            });
        };
    
  3. 然后你可以添加一个函数作为回调:

            dtx.getSearchResult(searchResult, searchText, function (data) {
                    //data contains the data from your ajax request.
                    searchFlag(true);
                    var test = searchResult();//i get data here
                    searchTxt(searchText);
                });