我在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;
现在有人对我说:“使用promise而不是deferred”(但没有解释原因。)这段代码工作得很好,但是似乎有些反模式的方式(我不确定如何但我在某处阅读过)。现在,我看到了许多文档和资源,并试图找出什么是最好的方法。
能否请您解释为什么这不是一个好方法?另外,如何用最佳方法重写此代码?
如果您以简单的语言提供答案将非常有帮助,因为我对Angular还是很陌生,所以我访问过很多链接,所以请不要向我抛出更多链接。谢谢。
编辑1:
我尝试实现ES6 implementation,但是在.then
函数中,当我只是更新变量时,它没有运行摘要周期,这意味着更改未反映在UI上,但可以正常使用我的代码和@smnbbrv提供的代码。您能否提供原因呢?
答案 0 :(得分:1)
我认为延迟不会有什么坏处(只要这最终与诺言相同),但是它不是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);
}
}
);
答案 1 :(得分:1)
我认为,这全都归结为试图减少加载时间的庞大的pieces肿软件,使用Promise.resolve()
限制了您使用诺言的能力……相比之下,将它们全部放入诺言数组然后推迟。
var service = {
getData:getData
}
return service;
function getData(){
getDataFromServerFunction
.$loaded()
.then(function (data){
deferred.resolve(data);
});
return deferred.promise;
}