javascript - 如何以及何时将 jQuery 回调重写为 Promise?

标签 javascript jquery promise

我考虑将现有的基于回调的代码重写为使用 Promise 的代码。但是我不确定这是否有意义以及如何开始。以下代码片段是该代码的一个大部分独立的示例:

function addTooltip($element, serverEndpoint, data) {
'use strict';

const DELAY = 300;
const TOOLTIP_PARENT_CLASS = 'hasTooltip';
let timeOutReference;
$element.hover(function hoverStart() {
    if ($element.hasClass(TOOLTIP_PARENT_CLASS)) {
        return;
    }
    timeOutReference = setTimeout(function getToolTip() {
        const $span = jQuery('<span class="serverToolTip">');
        $span.html(jQuery('<span class="waiting">'));
        $element.append($span);
        $element.addClass(TOOLTIP_PARENT_CLASS);
        jQuery.get(serverEndpoint, data).done(function injectTooltip(response) {
            $span.html(response.data);
        }).fail(handleFailedAjax);
    }, DELAY);
}, function hoverEnd() {
    clearTimeout(timeOutReference);
});
};

预期功能:当用户将鼠标悬停在 $element 上 300 毫秒时,将从服务器请求工具提示内容并将其附加到 $element

用 Promise 重写该代码是否有意义?我会如何做?

(jQuery是由框架(dokuwiki)提供的,所以我们不妨使用它。)

先前的研究:

最佳答案

首先,您需要将 setTimeout 包装到一个 Promise 中。只需创建一个接受超时并返回在超时后解决的 promise 的函数。

接下来,由于 jQuery.get 已经返回了一个 Promise,您只需将其放入 Promise 解析处理程序中并返回其 Promise。这样,下一个链接的 then 就会监听该 Promise,而不是计时器的 Promise。

它看起来像:

function timer(n){
  return Promise(function(resolve){
    setTimeout(resolve, n);
  });
}

timer(DELAY).then(function(){
  return jQuery.get(...)
}).then(function(response){
  // jQuery.get promise resolved
}).catch(function(error){
  // something failed somewhere
});

至于你的问题

Does it make sense to rewrite that code with promises and how would I do it?

这取决于你。我发现基于 promise 的代码更具可读性,但需要时间才能正确编写,特别是如果您打算编写纯回调并处理多个异步操作。我通常会首先编写代码回调(如果 API 更容易以这种方式编写),然后进行重构以提高可读性。

关于javascript - 如何以及何时将 jQuery 回调重写为 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486456/

相关文章:

jquery - 智能应用横幅不适用于 jQuery Mobile

javascript - 如何包装需要异步调用的复杂 if-then 语句?

javascript - loadData() 返回空数组

javascript - 是否可以在客户端运行代理视频媒体请求的 javascript 代理?

Javascript/n 显示为字符串的一部分

javascript - redux sagas 阻塞了浏览器

javascript - 取消选中有条件的复选框

javascript - 我在 Node.JS 中收到 SyntaxError,但我无法从日志消息中找出该错误的根源

javascript - 单击时的 Jquery 未获取 textarea 的更新值

Javascript - 迭代数组并调用 Jquery Ajax 请求并等待请求完成,然后再转到下一个请求?