Javascript 如何将$.get的结果传递给另一个函数的返回
我在回调jquery$.get()ajax函数时遇到问题。Javascript 如何将$.get的结果传递给另一个函数的返回,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我在回调jquery$.get()ajax函数时遇到问题。 我正在使用DataTables插件并尝试“扩展行以查看子级详细信息”示例(可以在这里看到)。问题是这行: row.child(格式(row.data()).show() 函数format()从前端呈现html direct rom,如图所示: function format ( d ) { // `d` is the original data object for the row return '<table cellpaddi
我正在使用DataTables插件并尝试“扩展行以查看子级详细信息”示例(可以在这里看到)。问题是这行:
row.child(格式(row.data()).show()
函数format()从前端呈现html direct rom,如图所示:
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>';
}
有没有一种使用回调的方法?还是不可能注意您的数据获取程序
foo()
返回承诺。只有当数据到达并且承诺得到解决时,才能对数据执行任何操作
您尝试的问题是,正如所写,format()
返回未定义的
,并且无法使其返回所需的结果。这就是异步的本质。最好的方法是返回由foo()
返回的承诺,但是这对您没有好处,因为(如您所知)您希望在oTable.fnOpen(…)
调用中得到结果,而不是结果的承诺
解决方案是在outide上使用异步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;
});
并且,假设此代码本身在某个外部函数中,那么您应该返回由整个链生成的承诺
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);
});
为什么不将oTable.fnOpen
放在done
回调中?@Alfonso Garnett这很好,我真的很感激,但我在另一个脚本中遇到了类似的问题,您的答案无法适用。并不是说这个答案没有用,而是罗默给出了一个真正澄清承诺本质的答案。不管怎样,谢谢你,你不仅回答了我的问题,而且还向我澄清了承诺本身的性质,我希望这个答案对其他人有用,对你的解决方案进行了测试,效果很好,谢谢。@maikoORD,很高兴能帮上忙。谢谢你的评论。
function open(id, nTr) {
return foo(id).then(function(result) {
return oTable.fnOpen(nTr, result, 'well hiddenRow');
}, function(jqXHR, textStatus, errorThrown) {
return errorThrown;
});
}
open(id, nTr).then(function(rowNode) {
//foo() returned a result and oTable.fnOpen() was called.
}).fail(function(error) {
//Something went wrong.
console.log(error);
});