如何在Angular JS中进行同步调用?

时间:2016-02-22 17:33:57

标签: javascript angularjs rest

以下代码应该是在数据库中更新用户名然后检索更新的用户名。 updateUserMame和getUserName是两个不同的REST调用。



updateName(name) {
    var obj = this;
    if (name === 'None') {
      name = null;
    }
    obj.UtilityService.updateUserName(name, obj.userId)
      .success(function (data) {
        if (data) {
          obj.getUserName(obj.userId);
          console.log('Name is updated for ID:'||obj.userId);
        } else {
           console.log('Something Wrong');
        }
      });
  }
  
getUserName(userId){
  obj.UtilityService.getUserName(userId)
        .then(function (result) {
          console.log(result.user.userId);
          }
}




我有用户名' Nathan Drake'在dataBase中。 当我使用' Elena Fisher'运行更新功能时,它将返回Nathan Drake'。

我已经阅读了一些文章来进行同步服务调用,但无法弄清楚出了什么问题。

请帮忙。

2 个答案:

答案 0 :(得分:0)

您可以将更新功能包装在promise

var updatePromise = $q.when(updateName(name)); // creates a promise 

当您的承诺完成处理后,您可以使用then()来解决此问题,success callbackerror callback

updatePromise().then(function successCallback(response){  // resolves the promise using then
  getUserName(userId) // execute the rest of your code
},
function errorCallback(response){
  console.log(error)
});

您需要将$q注入您正在使用的范围

答案 1 :(得分:0)

你的代码没有多大意义,那就是我看到可能的错误,因为它看起来你正在交换用户名和用户id并从函数内部调用obj上下文,即使它没有在那里声明等等。要么我们都缺少当您尝试运行代码或此代码时将失败。

以下是一些示例,其中包含一些修复和注释,说明如何使用回调(没有同步代码,正如此线程上的其他人所提到的那样,您应该避免实际等待I / O并使用回调代替)。 / p>

updateName(name) {
    var obj = this; // good, you captured this
    if (name === 'None') {
      name = null;
    }
    obj.UtilityService.updateUserName(name, obj.userId)
      .success(function (data) {
        if (data) {
        // ok, you successfully updated the name so why would you go back to the server and get it again? You know the value based on your update.
          console.log('Name is updated for ID:' + obj.userId.toString());

          // for your example though here is how you could handle it
          obj.getUserName(obj, obj.userId, function(user){ // i assumed the name is stored in variable userName
              console.log('Name from server = ' + user.userName); // no idea what you are returning but you can figure it out from here
              // maybe you also want to capture it again??
              obj.name = user.userName;
          });

        } else {
           console.log('Something Wrong');
        }
      });
  }

// pass in captured this as obj, the user id, and a callback
getUserName(obj, userId, callback){
  obj.UtilityService.getUserName(userId)
        .then(function (result) {
          callback(result); // call the callback with the result. The caller can then do something with it
      }
}