У меня есть функция контроллера, которая создает что-то. Когда функция вызывается, запускается setInterval
чтобы получить статус элемента.
Вот услуга:
(function () {
'use strict';
function myService($q) {
let deferred = $q.defer();
function createSomething(name) {
Meteor.call('createSomething', name, (err, res) {
if (err) {
deferred.reject(err);
} else {
//value returned is the created item (id, name, status)
deferred.resolve(res);
}
});
return deferred.promise;
}
function getStatus(id) {
Meteor.call('getStatus', id, (err, res) {
if (err) {
deferred.reject(err);
} else {
//statuses are queued, processing, created
deferred.resolve(res);
}
});
return deferred.promise;
}
return {
createSomething: createSomething,
getStatus: getStatus
}
}
angular.module('myApp').factory('myService', myService);
})();
И вот контроллер:
(function () {
'use strict';
function myController($scope, myService) {
let ctrl = this;
ctrl.create = (name) => {
myService.createSomething(name)
.then((item) => {
ctrl.statusInterval = setInterval(() => {
myService.getStatus(item.data.id)
.then((status) => {
//status is always 'queued' :(
if (status.data.status === 'created') {
clearInterval(ctrl.statusInterval);
//do something
}
});
}, 5000);
});
};
}
angular.module('myApp').controller('myController', myController);
})();
Когда я проверяю значение response
в getStatus
службы, статус изменяется каждый раз, когда он вызывается (очередь → обработка... обработка → создана). Однако значение status
в контроллере всегда равно queue
.
Как я могу получить значение обещания?
createSomething()
и getStatus()
должны создавать и возвращать свои собственные обещания. Они не могут делиться обещанием и работать должным образом во всех случаях.
Кроме того, они должны создавать и возвращать уникальное обещание каждый раз, когда они называются, а не одно и то же обещание каждый раз, когда они вызываются. Помните, что обещания - это односторонние государственные машины. После разрешения или отклонения их состояние никогда не изменяется, даже если на них снова вызывается reject()
resolve()
или reject()
.
Вот пример:
function createSomething(name) {
// create a unique deferred inside this function each time you call it
let deferred = $q.defer();
Meteor.call('createSomething', name, (err, res) {
if (err) {
deferred.reject(err);
} else {
//value returned is the created item (id, name, status)
deferred.resolve(res);
}
});
return deferred.promise;
}
$q.defer()
для каждой функции, которая затем возвращает обещание. Спасибо! Это работает сейчас! :)
createSomething
иgetStatus
пытаются разрешить одно и то же отложенное?