使用诺言而不是延期?

时间:2018-10-10 06:59:37

标签: angularjs promise 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;

现在有人对我说:“使用promise而不是deferred”(但没有解释原因。)这段代码工作得很好,但是似乎有些反模式的方式(我不确定如何但我在某处阅读过)。现在,我看到了许多文档和资源,并试图找出什么是最好的方法。

能否请您解释为什么这不是一个好方法?另外,如何用最佳方法重写此代码

如果您以简单的语言提供答案将非常有帮助,因为我对Angular还是很陌生,所以我访问过很多链接,所以请不要向我抛出更多链接。谢谢。

编辑1:

我尝试实现ES6 implementation,但是在.then函数中,当我只是更新变量时,它没有运行摘要周期,这意味着更改未反映在UI上,但可以正常使用我的代码和@smnbbrv提供的代码。您能否提供原因呢?

2 个答案:

答案 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;
}