Javascript 向DomOutline事件处理程序添加承诺

Javascript 向DomOutline事件处理程序添加承诺,javascript,dom,asynchronous,promise,Javascript,Dom,Asynchronous,Promise,我试图调用的异步函数由的onClick属性定义。在本例中,domClickHandler类似于接收所选元素的回调 var iWantThis; var myDomOutline = DomOutline({ onClick: domClickHandler, filter: false, stopOnClick: true, hideLabel: true }); var domClickHand

我试图调用的异步函数由的
onClick
属性定义。在本例中,
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对象时返回它

我承诺回调,但我不确定这将如何帮助我实现数组的同步返回
iwanthis

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()
    };

让我们一步一步来

多大的承诺啊 承诺是对价值概念的抽象——它代表价值+时间。您在it队列上执行的操作将在时机成熟时发生

承诺从待决开始,然后通过解决成为:

  • 实现了-意味着它可供使用和链接
  • 被拒绝-表示操作失败,您可以尝试从中恢复
在不是jQuery的库和本机承诺中,转换过程以及处理程序的执行始终是异步的。这是为了在可能是异步的情况下防止竞争条件

什么承诺都不是 承诺不是事件发射器-不能将承诺绑定到多次发生的事件,因为它表示单个值。表示多个值的承诺的对偶称为。不能将承诺绑定到单击事件

承诺不是魔术-它通常用JavaScript实现,不能将异步代码转换为同步代码,虽然它的
then
抽象了排序本身的概念,但如果没有语言支持,它就不能在异步操作上“停止”代码,以便需要其他语言工具,如生成器(ES6)或异步/等待(ES7)。对于大多数不想履行承诺的浏览器用户来说,可以让您的生活更轻松,但不能使异步代码同步

一般来说,承诺会使用返回值和抛出的异常来。。。返回值并引发异常。一个承诺只需要一个值就可以解决一次,就像一个值只有一个值一样,一旦你得到了它,它就不会改变

如何使用承诺 在您的情况下,点击处理程序基本上不能用承诺来建模——它需要一个事件发射器,也就是可观察的事件发射器。点击
onBtnClick
看起来很好

ready
事件的情况下-假设您(调用
$。当
本身没有帮助时),您需要链接到它:

 myDomOutline.start().then(function(){
     alert("Ready!");
 });
如果您想从外部访问它,这很好,因为:

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
});

作为补充阅读,请查看哪些不是以承诺为中心的,但仍然非常相关。

您希望承诺做一些他们不做的事情。承诺是价值的抽象,而不是将异步进程转换为同步进程的东西。你可能想。一旦实现,DomOutline的
onClick
回调将提供一个承诺,您可以将回调传递给promise方法
。然后()
@Roamer-1888我可以将回调
domClickHandler
转换为返回承诺,但您的最后一句话我不清楚。我将把
.then()
的链接放在哪里?阅读链接的Q/A。@Roamer-1888我已经更新了问题以添加更改,但我仍然不清楚如何在回调中返回数组。除了进入一些客户机-服务器模型之外,还有什么方法可以实现这一点吗。如果promise不是正确的方向,您能给我介绍另一种方法吗?Foreigner,您仍然没有抓住要点-您无法同步处理异步进程。无论是否使用承诺,异步进程的响应都必须在回调中处理。有了承诺,唯一改变的就是回调传递到的对象。