Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 用承诺代替延迟?_Angularjs_Promise_Deferred - Fatal编程技术网

Angularjs 用承诺代替延迟?

Angularjs 用承诺代替延迟?,angularjs,promise,deferred,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}', p

我在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;
现在有人对我说“使用承诺而不是延迟”(但没有解释原因)。这段代码工作得非常好,但它似乎是某种反模式的方式(我不知道怎么做,但我在什么地方读到过)。现在我看到了许多文档和资源,并试图找出实现这一点的最佳方法

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

如果你能用简单的语言提供你的答案,那将是非常有帮助的,因为我对Angular很陌生,而且我已经访问了很多链接,所以请不要再给我扔更多的链接。谢谢

编辑1:


我尝试在
中实现but。然后当我只是更新一个变量时,
函数没有运行摘要循环意味着更改没有反映在UI上,但它与我的代码和@smnbbrv提供的代码配合得非常好。你能提供它发生的原因吗

我看不出延迟有什么不好的地方(只要这最终是一个相同的承诺),但它不是ES6承诺标准/实施的一部分。这就是为什么现在您想要从$q迁移到原生承诺,您将很难做到这一点

如何更改功能:第一个示例完全适用于您的案例

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);
          }
      }
);

我不认为延迟有什么不好的地方(只要这最终是一个相同的承诺),但是它不是ES6承诺标准/实现的一部分。这就是为什么现在您想要从$q迁移到原生承诺,您将很难做到这一点

如何更改功能:第一个示例完全适用于您的案例

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()
限制了你使用承诺的能力……而不是将它们全部推到承诺数组中然后推迟

var service = {
getData:getData
}
return service;

function getData(){
  getDataFromServerFunction
       .$loaded()
       .then(function (data){
          deferred.resolve(data);
  });

  return deferred.promise;
}

我认为这一切都归结于大量臃肿的软件试图缩短加载时间,使用
Promise.resolve()
限制了你使用承诺的能力……而不是将它们全部推到承诺数组中然后推迟

var service = {
getData:getData
}
return service;

function getData(){
  getDataFromServerFunction
       .$loaded()
       .then(function (data){
          deferred.resolve(data);
  });

  return deferred.promise;
}

谢谢@smnbbrv的回答。你能解释一下这是一种比上一种更好的方法吗?如果你能补充关于ES6承诺标准/实施的细节,以及为什么我“不容易做到”,那就太好了。方法是一样的
现在有人对我说“用承诺代替延迟”(但没有解释原因)。
你应该问问告诉你的人。请参阅ES6承诺的实现,这是一个很长的故事;)。。。。无论如何,我实现了ES6 promise实现,但在
中。然后,当我更新某个变量时,
函数没有反映UI上的更改,意味着它没有运行摘要循环,您能告诉我为什么会发生这种情况吗?在上述两种情况下工作正常。我也在我的问题中添加了这个细节。
$q
对angularjs进行了绑定。本地人的承诺不会。在angular2+中,这不再是问题。谢谢@smnbbrv的回答。你能解释一下这是一种比上一种更好的方法吗?如果你能补充关于ES6承诺标准/实施的细节,以及为什么我“不容易做到”,那就太好了。方法是一样的
现在有人对我说“用承诺代替延迟”(但没有解释原因)。
你应该问问告诉你的人。请参阅ES6承诺的实现,这是一个很长的故事;)。。。。无论如何,我实现了ES6 promise实现,但在
中。然后,当我更新某个变量时,
函数没有反映UI上的更改,意味着它没有运行摘要循环,您能告诉我为什么会发生这种情况吗?在上述两种情况下工作正常。我也在我的问题中添加了这个细节。
$q
对angularjs进行了绑定。本地人的承诺不会。在angular2+中,这不再是问题。