使用 promise 而不是 deferred?
Use promise instead of deferred?
我在 salesforce visualforce 页面中使用 Angular JS。我写这段代码是为了从服务器获取一些信息。这是一个异步调用。
var deferred = $q.defer();
Visualforce.remoting.Manager.invokeAction( //You can related this with any asynchronous service
'{!$RemoteAction.somepage.someMethod}',
param,
function(result,event){
if(event.type=='exception'){
deferred.reject(event.message);
}
else{
deferred.resolve(result);
}
}
);
return deferred.promise;
现在有人对我说 "Use promise instead of deferred"(但没有解释原因。)这段代码工作得非常好,但它似乎是某种反模式的方式(我不确定如何但我在某个地方读过它。)。现在我看到了很多文档和资源,并试图弄清楚什么是最好的方法来做到这一点。
能否解释一下为什么这不是一个好方法?另外 我怎样才能用最好的方法重写这段代码?
如果您用简单的语言提供答案,那将非常有帮助,因为我对 Angular 还很陌生,而且我访问过很多链接,所以请不要给我更多链接。谢谢
编辑 1:
我尝试实现 ES6 implementation,但是在 .then
函数中,当我只是更新一个变量时,它不是 运行 摘要周期意味着更改没有反映在 UI 但它与我的代码和@smnbbrv 提供的代码完美配合。你能说明为什么会这样吗?
我不认为延迟有什么不好(只要这最终是相同的承诺)但是它不是 ES6 Promise 标准/实现的一部分。这就是为什么目前您想从 $q 迁移到原生 promise 并不容易。
如何改变你的功能:第一个例子from here完全适用于你的情况
return $q(function(resolve, reject) {
Visualforce.remoting.Manager.invokeAction( //You can related this with any asynchronous service
'{!$RemoteAction.somepage.someMethod}',
param,
function(result,event){
if(event.type=='exception'){
reject(event.message);
}
else{
resolve(result);
}
}
);
我认为这一切都归结为大量臃肿的软件试图缩短加载时间,使用 Promise.resolve()
限制了你使用 promises 的能力......与将它们全部推入 promises 数组然后推迟相比那。
var service = {
getData:getData
}
return service;
function getData(){
getDataFromServerFunction
.$loaded()
.then(function (data){
deferred.resolve(data);
});
return deferred.promise;
}
我在 salesforce visualforce 页面中使用 Angular JS。我写这段代码是为了从服务器获取一些信息。这是一个异步调用。
var deferred = $q.defer();
Visualforce.remoting.Manager.invokeAction( //You can related this with any asynchronous service
'{!$RemoteAction.somepage.someMethod}',
param,
function(result,event){
if(event.type=='exception'){
deferred.reject(event.message);
}
else{
deferred.resolve(result);
}
}
);
return deferred.promise;
现在有人对我说 "Use promise instead of deferred"(但没有解释原因。)这段代码工作得非常好,但它似乎是某种反模式的方式(我不确定如何但我在某个地方读过它。)。现在我看到了很多文档和资源,并试图弄清楚什么是最好的方法来做到这一点。
能否解释一下为什么这不是一个好方法?另外 我怎样才能用最好的方法重写这段代码?
如果您用简单的语言提供答案,那将非常有帮助,因为我对 Angular 还很陌生,而且我访问过很多链接,所以请不要给我更多链接。谢谢
编辑 1:
我尝试实现 ES6 implementation,但是在 .then
函数中,当我只是更新一个变量时,它不是 运行 摘要周期意味着更改没有反映在 UI 但它与我的代码和@smnbbrv 提供的代码完美配合。你能说明为什么会这样吗?
我不认为延迟有什么不好(只要这最终是相同的承诺)但是它不是 ES6 Promise 标准/实现的一部分。这就是为什么目前您想从 $q 迁移到原生 promise 并不容易。
如何改变你的功能:第一个例子from here完全适用于你的情况
return $q(function(resolve, reject) {
Visualforce.remoting.Manager.invokeAction( //You can related this with any asynchronous service
'{!$RemoteAction.somepage.someMethod}',
param,
function(result,event){
if(event.type=='exception'){
reject(event.message);
}
else{
resolve(result);
}
}
);
我认为这一切都归结为大量臃肿的软件试图缩短加载时间,使用 Promise.resolve()
限制了你使用 promises 的能力......与将它们全部推入 promises 数组然后推迟相比那。
var service = {
getData:getData
}
return service;
function getData(){
getDataFromServerFunction
.$loaded()
.then(function (data){
deferred.resolve(data);
});
return deferred.promise;
}