Если вам нужно использовать этот код:
if (Object.keys(AgentReply).length > 0) {
//do something with AgentReply
}
}
Вне .then()
Функция:
DataFactory.SendOTP('39487539847')
.then(function (response) {
})
Вы можете попробовать это:
$scope.ActionItems = function (actionItem) {
var def = jQuery.Deferred();
var AgentReply = {};
switch (actionItem) {
case "SendOTP":
var SentStatus = "";
DataFactory.SendOTP('39487539847')
.then(function (response) {
SentStatus = JSON.parse(JSON.parse(response.data));
if (SentStatus == "200") {
AgentReply = {
IsCustomer: false,
UserText: "Request Failed.",
}
def.resolve(AgentReply);
}
console.log(AgentReply); //available here
}, function (error) {
def.reject(error);
});
return def.promise();
break;
}
//console.log(AgentReply); //null here
//if (Object.keys(AgentReply).length > 0) {
//do something with AgentReply
// }
//}
// This is unusable in this case.
Использование является:
var someActionItem = 'SomeActionItemInfo';
$scope.ActionItems(someActionItem)
.then(function(agentReply) {
if (Object.keys(agentReply).length > 0) {
//do something with agentReply
}
}, function(error));
EDIT:
$scope.ActionItems
та же функция. Что происходит, когда вы используете обещание?
Сначала вы определяете объект деффер. var def = jQuery.Deferred()
. Этот объект находится в jQuery, но все рамки/библиотеки, которые поддерживают обещание, работают одинаково.
Как вы видите, вы возвращаетесь def.promise()
. Это объект, который содержит .then
. Из-за этого obj вы можете использовать метод $scope.ActionItems().then()
. Это действительно делает def.promise()
.
И внутри вашего асинхронного кода (этот код потребляет некоторое время и не выполняется немедленно), вы определяете def.resolve()
или def.reject()
.
Когда работа завершена. Вы звоните def.resolve(withSomeData)
, и это активирует метод .then()
до $scope.ActionItems
.
Например:
var foo = null;
function doPromise() {
var def = jQuery.Deferred();
setTimeout(function(){
foo = 2;
def.resolve(foo + 1) // This will call the .then() method with foo + 1
}, 500);
return def.promise();
}
doPromise();
console.log(foo) // foo = null here. cuz the function waiting 500ms.
// Here the .then() method will be executed after ~500+ ms.
doPromise().then(function(fooValue) {
console.log(fooValue) // foo value = 3 here. cuz function is done
});
Спасибо. Есть ли другой способ, я могу сделать это в $ scope.ActionItems сам – Qwerty
@Qwerty Есть ли причина, по которой вам нужно будет? – rwacarter
@Qwerty Теперь он находится в '$ scope.ActionItems', если это то, что вы имели в виду? – rwacarter