.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。有两种方法可以解决这个问题。
- 最好的方法:实现您自己的承诺解析器(请参阅 q.js documentation。Deferreds 部分正是您要查找的内容)
快速方法:向您的 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) {
});
我正在 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。有两种方法可以解决这个问题。
- 最好的方法:实现您自己的承诺解析器(请参阅 q.js documentation。Deferreds 部分正是您要查找的内容)
快速方法:向您的
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) {
});