我希望函数displayResults()在呈现值之前获取数据。函数getResultA()和getResultB()使用$ .Deferred。函数getResultB()依赖于getResultA()的结果。
function getResultA() {
var deferred = $.Deferred();
.
.
.
.
deferred.resolve(someValue);
return deferred.promise();
}
function getResultB() {
var deferred = $.Deferred();
.
.
getResultA().done(function(someValue) {
deferred.resolve(someValue);
return deferred.promise();
})
}
function displayResults() {
getResultB().done(function(response) {
// display the response
})
}
我的代码是否正确?
答案 0 :(得分:2)
您的getResultB()
是promise anti-pattern。您已经从getResultA()
返回了承诺。您无需创建新的。你可以退回你已经拥有的那个。
function getResultB() {
.
.
return getResultA().then(function(someValue) {
// whatever code you want here
// code here can return a new value, return the value you already have
// after doing some other operations or can return a new promise that
// will be added to the chain
return someValue;
});
}
然后,您可以按照规划使用getResultB()
:
function displayResults() {
getResultB().then(function(response) {
// display the response
})
}
注意:我切换到使用.then()
而不是.done()
,因为这是使用promises编码的ES6标准方式(并且它也适用于jQuery)。因此,随着jQuery更加符合promise标准,或者使用jQuery以外的来源进行编码,您将不必更改代码或样式。