2014-10-28 48 views
0

我有一个名为handleWidgetDrop的函数。在函数中,我调用另一个函数insertBlankWidget,它在promise对象的返回时执行某个函数。问题在于在函数调用到insertBlankWidget之后的handleWidgetDrop中的代码在承诺对象中的代码之前得到执行。在调用insertBlankWidget()之后的代码之前执行promise对象成功执行之后,如何撤消此操作并在函数中执行代码。 如何获取承诺对象成功函数中的代码在调用之后的代码之前执行?

handleWidgetDrop:function(){ 
 
    //some lines 
 
    this.insertBlankWidget(); 
 
    //Lines after insertBlankWidget call 
 
} 
 
    
 
insertBlankWidget:function(){ 
 
    var promise=this.getWidgetModel(); 
 
    promise.done(function(){ 
 
     //code which must be executed before Lines after insertBlankWidget 
 
    }); 
 
}

+0

使用回调,http://jsbin.com/zejowogemi/1/edit? – 2014-10-28 14:20:58

+0

诀窍是你只需要知道哪些代码可以异步运行。任何异步都必须进入JavaScript中的回调函数。将回调想象为稍后存储代码。然后,您只需将您的回调传递给承诺对象,或者在另一个回调中调用回调,或者使用许多其他可用工具之一来管理异步代码执行。 – Keen 2014-10-28 14:31:22

回答

3

只是链子承诺一个.done功能。要做到这一点,虽然,你必须从insertBlankWidget返回承诺:

insertBlankWidget:function(){ 
    var promise=this.getWidgetModel(); 
    promise.done(function(){ 
     //code which must be executed before Lines after insertBlankWidget 
    }); 
    return promise; 
} 

然后你就能链handleWidgetDrop

handleWidgetDrop:function(){ 
    //some lines 
    this.insertBlankWidget().done(function(){ 
     //Lines after insertBlankWidget call 
    }); 
} 
+0

如果在第一个承诺对象内有另一个承诺对象,即嵌套承诺对象,情况如何? – 2014-10-29 05:42:29

+0

@ user3876636然后返回一个promise数组并使用'$ .when.apply($,arr).done()'。它应该工作。 – 2014-10-29 12:28:53

+0

@ user3876636是否意味着在“完成”回调中还有另一个承诺?在这种情况下,你应该用'then'替换'done'并在'then'回调结束时返回promise。这将产生一个新的承诺,自动展现你的内在承诺。 – Keen 2014-10-29 17:36:52

0

可以使用什么作为一个回调函数。

修改insertBlankWIdget,使其接受函数作为参数,并在promise完成时调用该函数。

insertBlankWidget:function(callback){ 
    var promise=this.getWidgetModel(); 
    promise.done(function(){ 
     //code which must be executed before Lines after insertBlankWidget 
     callback(); 
    }); 
} 

然后handleWidgetDrop

handleWidgetDrop:function(){ 
    //some lines 
    this.insertBlankWidget(
     function() 
     { 
      //Lines after insertBlankWidget call 
     } 
    ); 
} 
+0

insertBlankWidget已经有一个参数。在那种情况下应该做什么? – 2014-10-29 06:07:54

+0

-1,对不起,这是一个不正确的方法,如果OP已经使用承诺。您可以轻松地“返还”承诺。不需要用回调重新实现这一点 - 更不用说它忽略了错误。 – 2014-10-29 09:41:14

+0

因为它已经可用,所以坚持承诺是更清洁的,但是我提高了,因为对于学习者来说重要的是要看到延续传递风格,这是承诺和其他JavaScript方法异步执行的基础(直到我们获得了生成器,这与这种方法仍然非常相似)。 – Keen 2014-10-29 17:41:01

相关问题