我在 jquery $.get() ajax 函数的回调方面遇到问题。
我正在使用 DataTables 插件并尝试“扩展行以查看子级详细信息”示例(可以在此处看到 https://www.datatables.net/examples/api/row_details.html )。
问题是这一行:
row.child( 格式(row.data()) ).show();
函数 format() 直接从前端渲染 html,如下所示:
function format ( d ) {
// `d` is the original data object for the row
return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
'<tr>'+
'<td>Full name:</td>'+
'<td>'+d.name+'</td>'+
'</tr>'+
'<tr>'+
'<td>Extension number:</td>'+
'<td>'+d.extn+'</td>'+
'</tr>'+
'<tr>'+
'<td>Extra info:</td>'+
'<td>And any further details here (images etc)...</td>'+
'</tr>'+
'</table>';
}
它使用表中已有的数据,并且 DataTables 没有关于如何以“服务器端”方式执行此操作的示例。
这里我使用ajax作为jquery延迟对象,我需要format()来返回foo()结果,但它没有发生。
function foo(value)
{
return $.get("<?php echo base_url()?>token/show?id="+value,null);
}
function format (id,callback)
{
callback(id).done(function(result)
{
//I need the result to be returned but somehow it's broken
return result;
}).fail(function()
{
alert('ajax error');
});
}
它不返回结果,但如果我执行控制台日志,它会毫无问题地打印整个 View 。
这是我调用该函数的地方
var td = ('td :first-child',$(this))[0];
var id = $('div',td).attr('id');
oTable.fnOpen( nTr, format(id,foo), 'well hiddenRow' );
有没有办法使用回调?或者这是不可能的?
问候
最佳答案
您的数据 getter foo()
返回一个 promise 。无论您对数据做什么,只有当数据到达并且 promise 得到解决时才能完成。
您的尝试的问题是,如所写,format()
返回undefined
并且不能返回 result
你要。这就是异步的本质。最好的方法是返回 foo()
返回的 promise 。 ,但这对你没有好处,因为(如你所知)你想要一个结果,而不是 oTable.fnOpen(...)
中的结果 promise 。打电话。
解决方案是使用异步 foo(...)
将整个表达式从内到外翻转。在外面,和 oTable.fnOpen(...)
在里面。
最简单的形式,代码是:
foo(id).then(function(result) {
return oTable.fnOpen(nTr, result, 'well hiddenRow');
});
但是您还应该包括一些错误处理:
foo(id).then(function(result) {
return oTable.fnOpen(nTr, result, 'well hiddenRow');
}, function(jqXHR, textStatus, errorThrown) {
return errorThrown;
});
并且,假设此代码本身位于某个外部函数内,那么您应该返回整个链生成的 promise 。
function open(id, nTr) {
return foo(id).then(function(result) {
return oTable.fnOpen(nTr, result, 'well hiddenRow');
}, function(jqXHR, textStatus, errorThrown) {
return errorThrown;
});
}
这反过来将允许在 open()
成功/失败时采取适当的操作。流程。
open(id, nTr).then(function(rowNode) {
//foo() returned a result and oTable.fnOpen() was called.
}).fail(function(error) {
//Something went wrong.
console.log(error);
});
关于javascript - 如何将 $.get 的结果传递给另一个函数的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30428597/