객체가 작성되었는지 확인할 때 객체의 등록 정보를 가져오는 방법

질문:

저는 MainVM라는 변수가 있습니다. 기본 레이아웃 보기에서 해당하는 .js 파일을 불러오고 서로 다른 보기에서MainVM의 속성을 설정해야 할 때마다 이 변수는 보기 모델을 제거하는 새로운 사례로 설정됩니다.
var MainVM;
core.load(["Scripts/Shared/MainViewModel.js"],
  function () {
    MainVM = new MainViewModel();
});
문제: MainVM에 설정된 MainViewModel의 새로운 실례를 확보하고 속성을 설정해야 합니다.
내가 한 것은 그것을 setTimeout에 봉하는 것이다. 200밀리초 후에 나는 MainVM를 호출할 것이다. 이것은 다음과 같이 설정하기를 바란다.
$(function() {
  setTimeout(function() {
    core.load(["Scripts/Account/AccountMainViewModel.js"],
      function () {
        MainVM.CurrentVM(new AccountMainViewModel());
        MainVM.CurrentVM().Load();
        });
  }, 200);
});
그러나 어떤 이유로MainVM의 적재시간이 200ms를 훨씬 넘으면 이 방법은 정확하지 않은 것 같다.그 밖에 나는 setInterval 을 사용하여 함수를 계속 호출하고 MainVM 10밀리초에 한 번씩 정의하는지 검사하고 싶다.그러나 나는 이 문제를 어떻게 처리하는지 더 좋은 방법을 아는 사람이 있는지 알고 싶다. 예를 들어 우리는 promisethen. But here it is not a function that I can take advantage ofpromise`를 사용하여 리셋 함수로 사용할 수 있다.공유 기본 레이아웃에서 한 번 호출되었습니다. 함수에 넣을 수 없습니다. 다른 곳에서 다시 호출할 수 없습니다.

답안

는 리셋 함수$.Deferred()에서 core.load(["Scripts/Shared/MainViewModel.js"])로 전달되며, MainVM 호출이 완료되면 deferred.resolve()로 작업을 수행할 수 있습니다..ready()에서 프로세서가 사용한 .then() 접근 확인된 약속값: MainVM
var MainVM; var deferred = $.Deferred();
core.load(["Scripts/Shared/MainViewModel.js"],
  function () {
    MainVM = new MainViewModel();
    deferred.resolve(MainView);
});

$(function() {
    deferred.promise().then(function(mainview) {
      // `view` : `MainVM`
      core.load(["Scripts/Account/AccountMainViewModel.js"],
        function () {
          mainview.CurrentVM(new AccountMainViewModel());
          mainview.CurrentVM().Load();
      });
    })
    // handle error
    .fail(function(err) {
      console.log("error loading MainVM", err)
    })    
});
function MainViewModel() {
  this.id = 123;
  this.CurrentVM = function() {
    return this.id
  };
}

var MainVM;
var deferred = $.Deferred();
var core = {
  load: function(script, callback) {
    callback(script)
  }
}
core.load(["Scripts/Shared/MainViewModel.js"],
  function() {
    // asynchronous process
    setTimeout(function() {
      MainVM = new MainViewModel();
      // resolve `MainVM`
      deferred.resolve(MainVM);
    }, 1 + Math.floor(Math.random() * 3500))
  });

$(function() {
  deferred.promise().then(function(mainview) {
      // `view` : `MainVM`
      core
        .load(["Scripts/Account/AccountMainViewModel.js"], function() {
          console.log(mainview.CurrentVM(), MainVM)
        });
    })
    .fail(function(err) {
      console.log("error loading MainVM", err)
    })
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>