2015-02-10 90 views
1

我正在使用Knockout jQuery和Require在Durandal开发SPA。我的问题是,当我对我的API进行ajax调用时,实际上并没有在.then语句之外获得我的数据(当我将Get方法替换为下面注释的行时)。但是,如果我与当前的电话工作,我不能使用。然后它给了我一个类型未定义的错误。我已经看过杜兰达尔,他们解释了如何使用Q,我拥有它并在我的主要内容中引用。不知道的补丁提到here。然后.done承诺不适用于使用淘汰赛和js的durandal spa

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

回答

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

BTW,设置'dataType'选项是多余的,所以Ajax调用可以折叠为'.get('/ Api/Data/GetItem /'+ text)'。但必须注意'text'是URL编码正确的。不编码它是一个错误。 – Tomalak 2015-02-10 08:26:56

+1

哦,还有一点,因为knockout observables是函数,它们可以直接用作回调:'search(searchText).done(targetObservable)'。 – Tomalak 2015-02-10 08:43:13

+0

这为我工作和@Jan Hommes下面的答案也是有帮助的。非常感谢您的提示 – mboko 2015-02-10 08:57:41

1

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

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