2014-10-28 76 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

相關問題