延迟函数并确保最终函数接收到两个数据
Deferred functions and making sure final function receives both data
我希望函数 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
})
}
我的代码正确吗?
你的 getResultB()
是 promise anti-pattern。您已经从 getResultA()
得到了 return 的承诺。您不需要创建一个新的。你可以只 return 你已有的那个。
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 以外来源的 promise 进行编码时,您将不必更改您的代码或风格。
我希望函数 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
})
}
我的代码正确吗?
你的 getResultB()
是 promise anti-pattern。您已经从 getResultA()
得到了 return 的承诺。您不需要创建一个新的。你可以只 return 你已有的那个。
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 以外来源的 promise 进行编码时,您将不必更改您的代码或风格。