【问题标题】:Use promise instead of deferred?使用承诺而不是延迟?
【发布时间】:2019-03-15 00:31:18
【问题描述】:

我在 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 提供。你能提供为什么会这样吗?

【问题讨论】:

    标签: angularjs promise deferred


    【解决方案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);
              }
          }
    );
    

    【讨论】:

    • 感谢@smnbbrv 的回答。如果您可以添加有关 ES6 Promise 标准/实现的详细信息以及为什么我“不容易做到这一点”,那您能否解释一下它是如何比以前更好的方法。
    • 方法是一样的。 Now someone said to me that "Use promise instead of deferred" (but didn't explain why.)你应该问问告诉你的人。 ES6 Promise 实现见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 说来话长 ;) ....无论如何我实现了 ES6 承诺实现,但是在 .then 函数中,当我更新一些变量时,它不会反映 UI 上的变化,意味着它没有运行摘要循环,你能告诉我为什么会这样吗?在上述两种情况下工作正常。我也在我的问题中添加了这个细节。
    • $q 有 angularjs 的绑定。原生承诺没有。在 angular2+ 中,这不再是问题了。
    【解决方案2】:

    我认为这完全是由于大量臃肿的软件试图缩短加载时间,使用 Promise.resolve() 限制了您使用 Promise 的能力...与将它们全部推入 Promise 数组然后推迟它相比。

    p>
    var service = {
    getData:getData
    }
    return service;
    
    function getData(){
      getDataFromServerFunction
           .$loaded()
           .then(function (data){
              deferred.resolve(data);
      });
    
      return deferred.promise;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 2017-11-24
      • 1970-01-01
      • 2015-03-27
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多