javascript - 如何将 $.get 的结果传递给另一个函数的返回

标签 javascript jquery ajax promise

我在 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/

相关文章:

javascript - 谷歌浏览器,无限循环和选择文本

javascript - 是否可以在使用 JavaScript 显示之前将 ISO8859-1 编码的文本提要转换为 UTF-8?

jquery - 如何摆脱 jquery 错误

javascript - html嵌套折叠没有 Bootstrap ,jquery

javascript - 如何使 material-ui Modal 可滚动

php - 使用 JQuery Ajax 防止 Ajax CSS 破坏主 CSS

javascript - jQuery 延迟 - 我需要管道或链来实现这种模式吗?

php - 进行 AJAX 调用以更新数据库 onChange of a textarea

javascript - 使用 setState() 更新嵌套的 React 状态属性的最佳替代方法是什么?

javascript - 用于信用卡检测的 RegEx 和 Keyup