javascript - 将 Promise 添加到 DomOutline 事件处理程序

标签 javascript dom asynchronous promise

我尝试调用的异步函数是由 DomOutlineonClick 属性定义的。对于此示例,domClickHandler 就像接收所选元素的回调。

    var iWantThis;

    var myDomOutline = DomOutline({
        onClick: domClickHandler,
        filter: false,
        stopOnClick: true,
        hideLabel: true
    });

    var domClickHandler = function(element){
        iWantThis = element
        console.log("I am the element you've selected: " + element);
    };

    myDomOutline.start();
    console.log("From the outside world: " + iWantThis);
    return iWantThis;

DomOutline.start() 立即返回,domClickHandler 是异步回调。因此,在此示例中,即使在我选择元素之前,最后一个 console.log 也将返回 undefined。我尝试过在包装 DomOutline.start() 的函数上尝试 $.when() 以返回 promise(),但它没有不要使异步调用同步。在这里使用 Promise 的方法是什么,以便我可以在选择 DOM 对象时返回它?

我 promise 了回调,但我不确定这将如何帮助我实现数组的同步返回iWantThis

var domClikcHandler= function(element){
        var dfd = $.Deferred();
        classifiedElements = __classifyChildrenElements(element);
        dfd.resolve(classifiedElements);
        dfd.then(function(e){
            console.log(e);
            iWanThis = e;
        });
        return dfd.promise()
    };

最佳答案

让我们一步一步地进行。

什么是 promise

promise 是值(value)概念的抽象 - 它代表值(value)+时间。您在队列上执行的操作将在时间到来时发生。

promise 一开始是待定,然后通过解决变成:

  • 已实现 - 意味着它可供使用和链接。
  • 拒绝 - 表示操作失败,您可以尝试从中恢复

在非 jQuery 库和 native Promise 中 - 转换过程以及处理程序的执行始终异步。这是为了防止在可能异步的情况下出现竞争情况。

promise 不是什么

Promise 不是事件发射器 - 您无法将 Promise 绑定(bind)到多次发生的事件,因为它代表单个值。代表多个值的对偶 promise 称为 Observable 。您无法将 promise 绑定(bind)到点击事件。

Promise 并不神奇 - 它通常用 JavaScript 实现,它不能将异步代码转换为同步代码,而它的 then 抽象了排序本身的概念 - 它如果没有语言支持,就无法在异步操作上“停止”代码,以便需要其他语言设施,例如生成器(ES6)或异步/等待(ES7)。对于大多数不想通过 a compile step 的浏览器用户Promise 可以让你的生活更轻松,但不能使异步代码同步。

一般来说,promise 使用返回值和抛出异常......返回值和抛出异常。 Promise 使用单个值解析一次,就像一个值只有一个值一样,一旦您获得它,它就不会改变。

如何使用 promise

在您的情况下,点击处理程序从根本上无法使用 promise 进行建模 - 它需要一个事件发射器(又名可观察)。 onBtnClick 看起来很好。

ready 事件的情况下 - 假设您 promisified it correctly (调用 $.when 本身没有帮助)您需要链接到它:

 myDomOutline.start().then(function(){
     alert("Ready!");
 });

如果你想从外部访问它,那没问题,因为 Promise 是这样写的:

function startWithData(){
     var request = $.ajax(...);
     return myDomOutline.start().then(function(){ // note the return
         startAnimations();
         doAnotherThing();
         return request; // return the request
     });
}

startWithData().then(function(data){
    // ajax done and ready event fired
    // access data here
});

作为补充阅读,请参阅 How to return the response from an AJAX call?这不是以 promise 为中心,但仍然非常相关。

关于javascript - 将 Promise 添加到 DomOutline 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643719/

相关文章:

php - cURL 有时会为有效的 URL 返回空白字符串

flutter - 即使使用异步,在 Flutter 中进行繁重的计算操作时 UI 也会滞后

javascript - JS中如何实现数字乘法

javascript - 获取 iframe 的文档对象

javascript - CSS Z-index child above parent and div under parent

javascript - 如何用 javascript/jquery 填充 div 元素

javascript - 获取HTML页面中所有 `position:fixed`的元素?

javascript - Angular - 从 Promise 同步获取

javascript - 所有其他代码运行后出现模态弹出加载屏幕

javascript - 使用 toBlob 下载 Canvas 图像