Использовать обещание вместо отсроченного? - PullRequest
0 голосов
/ 10 октября 2018

Я использую Angular JS на странице salesforce visualforce.Я написал этот код, чтобы получить некоторую информацию с сервера.Это асинхронный вызов.

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:

Я пытался реализовать реализацию ES6 , но в функции .then, когда я просто обновляю переменнуюон не запускает цикл дайджеста, что означает, что изменения не отражаются на пользовательском интерфейсе, но он прекрасно работает с моим кодом и кодом, предоставленным @smnbbrv.Можете ли вы представить, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я думаю, что все сводится к огромным раздутым программам, пытающимся сократить время загрузки с использованием Promise.resolve(), ограничивающим вашу способность использовать обещания ... по сравнению с помещением их всех в массив обещаний и последующей их отсрочкой.

var service = {
getData:getData
}
return service;

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

  return deferred.promise;
}
0 голосов
/ 10 октября 2018

Я не вижу ничего плохого в отсрочке (если это, в конце концов, своего рода обещание), однако это не является частью стандарта / реализации ES6 Promise.Вот почему в данный момент вы хотите перейти от $ 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);
          }
      }
);
...