.then .done promises not working in durandal spa using knockout and js

.then .done promises not working in durandal spa using knockout and js

我正在 Durandal 使用 Knockout jQuery 和 Require 开发 SPA。我的问题是当我对我的 API 进行 ajax 调用时,我实际上并没有在 .then 语句之外获取我的数据(当我用下面注释掉的行替换我的 Get 方法时)。但是,如果我使用当前调用,我将无法使用 .then 它会给我一个类型未定义的错误。我看过 Durandal,他们解释了如何使用 Q,我有它并在我的 main 中引用了它。不确定提到的补丁 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
        };

getSearchResult 没有 return 承诺。所以你不能使用 q.js promise。有两种方法可以解决这个问题。

  1. 最好的方法:实现您自己的承诺解析器(请参阅 q.js documentationDeferreds 部分正是您要查找的内容)
  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) {
                }
            });
        };
    

然后你可以添加一个函数作为回调:

        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);
            });

如果你让 getSearchResult return 一个承诺呢?

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 return 一些承诺:

    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) {

});