2015-01-22 3 views
0

Как переписать этот код, чтобы получить желаемый о/р. Я хотел бы использовать объект AgentReply после заполнения данных. Внутри корпуса коммутатора этот объект имеет данные. Но один раз снаружи он снова пуст. Понял, что это из-за async, Но что мне делать, чтобы иметь возможность использовать «AgentReply», когда у него есть данные.Работа с обещанием - angularjs

$scope.ActionItems = function (actionItem) { 
var AgentReply = {}; 
switch (actionItem) { 
case "SendOTP": 
       var SentStatus = "";     
       DataFactory.SendOTP('39487539847') 
       .then(function (response) { 
        SentStatus = JSON.parse(JSON.parse(response.data)); 
        SendOTPFailed();       
       }, function (error) { 
       });     
       break; 
}/*End of switch*/ 
function SendOTPFailed(){ 
    if (SentStatus == "200") { 
    AgentReply = { 
     IsCustomer: false, 
     UserText: "Request Failed.", 
    }        
    } 
} 

if (Object.keys(AgentReply).length > 0) { 
    //do something with AgentReply 
    } 
} 

ответ

1

Просто передать функцию, чтобы где AgentReply доступен, и определить его снизу, то есть:

$scope.ActionItems = function (actionItem) { 
    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.", 
         }        
        } 
        doSomethingWithAgentReply(AgentReply); 
       }, function (error) { 
      });     
      break; 
    } 
    console.log(AgentReply); //null here 

    function doSomethingWithAgentReply(reply) { 

     if (Object.keys(reply).length > 0) { 
      //do something with AgentReply 
     } 
    } 
} 
+0

Спасибо. Есть ли другой способ, я могу сделать это в $ scope.ActionItems сам – Qwerty

+0

@Qwerty Есть ли причина, по которой вам нужно будет? – rwacarter

+0

@Qwerty Теперь он находится в '$ scope.ActionItems', если это то, что вы имели в виду? – rwacarter

1

Если вам нужно использовать этот код:

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 
}); 
+0

является '$ scope.ActionItems (someActionItem)' еще одна функция. Я не могу понять, что происходит после 'def.promise(); break;' из вашего кода, пожалуйста. – Qwerty

Смежные вопросы