使用 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;
}