两个功能之间的区别

时间:2015-07-10 20:25:31

标签: javascript ember.js

javascript编写的这两个函数有什么区别?

function 1

var a, b;

this.get('obj').then(function(ob) {
    a = ob.get('prop');
}.bind(this)).then(function() {
    this.get('obj').reload();
}.bind(this)).then(function(){
    b = this.get('obj.prop')    
}.bind(this))

function 2

this.get('obj').then(function(ob) {
    a = ob.get('prop');
}.bind(this)).then(function(){
   this.get('obj').reload().then(function(){
       b = this.get('obj.prop');
   }.bind(this))
}.bind(this))

第一个是错误的。

1 个答案:

答案 0 :(得分:4)

我在代码中添加了一些标记以供参考。

这是片段#2:

this.get('obj').then(function(ob) { // #1
    a = ob.get('prop'); 
}.bind(this)).then(function() { // #2
   this.get('obj').reload().then(function() { // #3
       b = this.get('obj.prop'); 
   }.bind(this))
}.bind(this));

现在,区别在于它保证在重载方法完成后将调用回调#3,换句话说 - 只有在重新加载承诺解决后才会初始化变量b

另一方面,在第一个代码段中,变量b会根据reload承诺的状态独立初始化。

演示:这是一个演示,供您直观地看到差异http://jsfiddle.net/fn93gz3w/ (删除false&&运行代码段)。

最后,如果从第二个then块返回新的Promise,则可以使第一个代码段与第二个代码段(正确)相同:在这种情况下,promises将被链接,第三个回调函数为{{1初始化将等到b结算。在我的演示中检查此行为。