Angular - Promise: как синхронизировать функции - PullRequest
0 голосов
/ 24 сентября 2018

Я использую angular1, и у меня есть 4 функции, которые должны выполняться синхронно.Предположим, что эти функции: f1, f2, f3, f4 и должны выполняться в этом порядке.f1, f2, f3, f4 являются функциями, которые используются независимо в других случаях.У меня есть только один вариант использования, где мне нужно выполнить их последовательно.Я знаю, что должен использовать обещание, и я попытался как:

self.selectionPromise = function(){
            var deferred = $q.defer();

            console.log("Inside promise");
            self.f1();

            return deferred.promise;
        };

А затем использовать его как:

self.updateSelectedFile = function () {
            self.selectionPromise()
                .then(self.f2() )
                .then(self.f3() )
                .then(self.f4() )
        }

Кажется, не решить мою проблему.Я вижу ошибку: ** TypeError: Невозможно прочитать свойство 'then' из undefined и, кроме того, функции не в порядке **

Могу ли я получить справку о том, как использовать ожидаемую синхронизацию этих 4 функций?

Вот подсказка о структуре кода:

Функция F1:

self.setRecordCount = function () 
{
    var deferred = $q.defer();
    if (!self.selectedFile) 
    {
        self.recordCount = 0;
        return;
    }


    self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};

    FileService.getRecordCount(self.fileInfo)
        .then(
            function (count) 
            {
                //do something
            },
            function (errResponse) 
            {
                self.recordCountError = "Error while getting record count for file: " + self.folderPath + self.selectedFile;
            }
        )
        .then(function finishUp(response) 
        {
            console.log("returning from recordCount");
        })
    ;

    deferred.resolve("RecordCount");
    deferred.promise;
}

функция F2:

self.detectDelimiter = function () {
    var deferred = $q.defer();
    if (!self.selectedFile) {
        return;
    }

    self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};
    FileService.detectFileDelimiter(self.fileInfo)
        .then(
            function ( fileDelimiter ) {

                //do something

            },
            function( errResponse ) {
                self.displayError = "Error attempting to detect file delimiter";
            }
        )
        .then(function finishUp(response){
            console.log("returning from detectDelimeter");
        })
    ;

    deferred.resolve("Detect Delimeter");
    deferred.promise;
}

Теперь я пытаюсь синхронизировать эти 2 функции F1 и F2 и выполнить третий вызов функции:

self.updateSelectedFile = function () 
{
    self.setRecordCount()
        .then(function(){
            console.log("promise done : setRecordCount")
            self.detectDelimiter()
                .then(function(){
                    console.log("promise done : detectDelimiter")
                    self.generateFilePreviewInfo();
                })
        })
}

1 Ответ

0 голосов
/ 24 сентября 2018

Вы должны связать обещание при каждом обратном вызове функций.Если у вас есть какой-либо асинхронный код внутри какой-либо функции, убедитесь, что решение вызывается после успешного обратного вызова внутреннего асинхронного кода

class HomeCtrl {
  constructor($scope, $q) {
    'ngInject';

    this.name = "AngularJS";
    execute();
    function execute() {
      selectionPromise().then(function (data) {
        f1().then(function (data) {
          f2().then(function (data) {
            f3().then(function (data) { });
          });
        });
      });
    }

    function selectionPromise() {
      var deferred = $q.defer();
      console.log("Inside promise");
      deferred.resolve("someData")
      return deferred.promise;
    };
    function f1() {
      var deferred = $q.defer();
      console.log("Executed 1 ")
      deferred.resolve("Some Data from F1")
      return deferred.promise;
    }
    function f2() {
      var deferred = $q.defer();

      console.log("Executed 2 ")
      deferred.resolve("Some Data from F2")
      return deferred.promise;
    }
    function f3() {
      var deferred = $q.defer();
      console.log("Executed 3 ")
      deferred.resolve("Some Data from F3")
      return deferred.promise;
    }
  }

}

export default HomeCtrl;

Образец демонстрации, созданный в StackBlitz

...