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队列上执行的操作将在时机成熟时发生 承诺从待决开始,然后通过解决成为:
- 实现了-意味着它可供使用和链接
- 被拒绝-表示操作失败,您可以尝试从中恢复
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,您仍然没有抓住要点-您无法同步处理异步进程。无论是否使用承诺,异步进程的响应都必须在回调中处理。有了承诺,唯一改变的就是回调传递到的对象。