javascript - 从异步或同步 JavaScript 请求返回值

标签 javascript jquery ajax asynchronous

下面的函数首先进行同步比较test == 0,如果通过则返回一些内容,如果不通过则进行异步请求。我的目的是让后者返回一些其他内容,例如“来自帖子回调的内容”,但我知道我做错了。不把Ajax请求改成同步的,可以吗?

var value = function (test) {
    if (test == 0) {
        return 'value is zero ';
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }, function (r1) {
            console.log('r1', r1);
            return 'something from post callback';
        })
            .done(function (r2) {
            console.log('r2', r2);
            return 'something from done callback';
        });
    }
}(1);

console.log(value);

https://jsfiddle.net/o5kq8he6/2/

最佳答案

既然您已经从 ajax 调用中返回一个 promise ,那么从您的同步比较中,只需返回一个已解决的 promise 。然后,两个代码路径都返回使用终端值解析的 promise ,调用者可以使用相同的代码来处理结果,无论它在内部以何种方式工作。对于有时同步有时异步的代码,这是一种常见的设计模式。

var myFunc = function (test) {
    if (test == 0) {
        return $.Deferred().resolve('value is zero ');
    } else {
        return $.post('/echo/html/', {
            html: 'false ',
            delay: .5
        }).then(function (r2) {
            console.log('r2', r2);
            // this will be the return value of the promise
            return 'something from ajax finished';
        });
    }
};

myFunc(1).then(function(value) {
    // value is here either way
});

仅供引用,在您的 $.post() 中同时使用成功处理程序函数和 .done() 处理程序是没有意义的。如果您要从函数返回一个 promise (这是我的建议),那么您应该只使用 promise 处理程序,而不是成功回调。

您可能还需要了解,从 ajax 调用的成功处理程序返回值没有任何用处。该返回值只是返回到 ajax 基础结构的异步内部,并且永远不会被任何东西使用。

关于javascript - 从异步或同步 JavaScript 请求返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779492/

相关文章:

javascript - 这个 typescript 方案是什么意思?

javascript - jquery 递增索引输入数组

javascript - 正则表达式 Javascript 替换

javascript - 同时链接点击和异步 AJAX 请求期间的竞争条件?

javascript - 在今天的日期上加一年

javascript - 将 div 放在 div 顶部

javascript - 我面临与 ngx-spinner 相关的问题

javascript - jQuery 获取上一个跨度

javascript - 在php中执行echo命令

jquery - 从 ajax 调用时 DataTable 不应用样式