2011-10-31 41 views
4

假设你有下面的一段代码:您是否需要使用带有单个延迟对象的jQuery.when?

function someProcess() { 
    var deferred = $.Deferred(); 

    apiCall(function (recvData) { 
     deferred.resolveWith(null, [recvData]); 
    }); 

    return deferred.promise(); 
} 

function mainFunction() { 
    $.when(someProcess()) 
     .then(someOtherProcess); 
} 

在这个例子中,我只需要等待一个推迟到解决。在这种情况下,就是写的第二个功能如上对这样写的区别吧(如果有的话):

function mainFunction() { 
    someProcess() 
     .then(someOtherProcess); 
} 

我的意思是,因为它清楚地表明,我们”我喜欢写它的第一种方式重新使用jQuery延迟对象,但我很好奇,在这种情况下是否有必要。

编辑:我在then()调用中修复了一个错字。感谢您的支持。

编辑:感谢您的答案nrabinowitz。我认为你已经确定了我不确定使用when()和使用原始jQuery延迟对象实例的观点。我再次修复我的代码以返回一个承诺,而不是整个延期对象。这就是我现在在我的实际代码中做的,只是忘了在这里添加它。

+1

'someOtherProcess()'应该是'someOtherProcess'。在第一种情况下,您立即调用该函数。 –

+0

@RobW我认为他应该立即调用它,因为'$ .when'需要函数返回的延迟对象,而不是函数。 –

+0

@KevinB'someOtherProcess()'在'then'里面,而不是'when'。 –

回答

2

我没有使用自定义的延迟对象,但我的理解是,有在你的例子有两点不同:

  • 使用$.when()允许你随意添加更多的递延对象由您的处理程序进行处理。很明显,这不是什么大问题,因为你必须改变那一行代码来添加更多的延迟。

  • $.when()仅获取无极对象,而不是整个延迟对象,其中,如果我理解正确是一个一致性度量来隐藏该延迟的状态改变的方法(例如resolve()),只露出处理钩和状态的检查方法。这似乎是一种很好的做法,但在你的例子中,你可以通过调用someProcess().promise()而不是$.when(someProcess())来做同样的事情。

因此,我认为你是对的 - 这两种方法都可以工作,但使用$.when()的主要好处是使代码更易读,并适当对其他程序员设定的预期。另外使用$.when()deferred.promise()还可以帮助防止某些不太能胜任的编码人员以混乱的方式混淆延迟状态。

+0

谢谢。我非常同意你所说的一切,所以我会继续前进,让这个问题得到解决。我很欣赏这些意见。 –