我通常会执行任何异步类型调用的实际.done()函数中所需的大部分内容。但在这种情况下,我想返回字符串,因为我需要多个位置,但此函数始终返回undefined。该变量超出了异步调用的范围,因此应该可以返回no?
var stringIWantBack = function getTableEditorFieldArray(pageName, tableId) {
var searchString = 'webpagename[name ="' + pageName + '"] > tableid[id ="' + tableId + '"] > editor';
var fieldArray;
$.when(datatableUtility.GetInitStringXml())
.done(function (returnedXml) {
fieldArray = $(returnedXml).find(searchString).text();
return fieldArray;
})
.fail(function (jqXhr, textStatus, errorThrown) {
// alert("Error downloading projection data: " + textStatus + " Error: " + errorThrown);
toastr.warning('Error downloading datatable editor fields array: ' + textStatus + ' Error: ' + errorThrown);
});
}
答案 0 :(得分:0)
问题不在于范围。你完全可以从fieldArray
函数返回getTableEditorFieldArray()
。
var fieldArray;
$.when(/* ... */ );
return fieldArray;
此时,fieldArray
的值为undefined
。 $.when()
代码甚至可能不存在,因为它将等待下一个tick(在此调用堆栈之外)进行任何工作。
您必须接受回调才能异步返回值。请注意,您可以返回$.when()
返回的承诺,并且多位代码可以在其上调用.done()
。使用.done()
设置的回调将按照定义它们的顺序调用。
答案 1 :(得分:0)
您无法从AJAX(异步)函数返回任何内容。它在后台运行,并且在完成后将在某些时候调用回调。到那时,你的功能已经返回并完成了。
你可以做的是:
function getTableEditorFieldArray(pageName, tableId) {
var searchString = 'webpagename[name ="' + pageName + '"] > tableid[id ="' + tableId + '"] > editor';
return $.when(datatableUtility.GetInitStringXml()).then(function (returnedXml) {
return $(returnedXml).find(searchString).text();
}).fail(function (jqXhr, textStatus, errorThrown) {
// alert("Error downloading projection data: " + textStatus + " Error: " + errorThrown);
toastr.warning('Error downloading datatable editor fields array: ' + textStatus + ' Error: ' + errorThrown);
});
}
在此使用.then()
代替.done()
将允许您操作数据。那里的return
将发送到您稍后附加的任何.done()
方法。
例如:
getTableEditorFieldArray('test', 123).done(function(stringIWantBack){
// This will be the value returned from `.then()`
console.log(stringIWantBack);
});