gpt4 book ai didi

angularjs - Node.js + Angular.js promise 同步问题

转载 作者:可可西里 更新时间:2023-11-01 09:39:23 25 4
gpt4 key购买 nike

我正在开发一个聊天应用程序,它在服务器端是 Node.js + MongoDB(Mongoose 库),在客户端是 Angular.js。

我有一个房间(应用程序中的所有房间)的数据库集合 (MongoDB),如下所示:

// ------- creating active_rooms model -------
var active_rooms_schema = mongoose.Schema({
room_name: String,
users: [String]
});
var active_rooms = mongoose.model('active_rooms', active_rooms_schema);

此数据库包含一个包含所有用户的房间(即“我的酷房间”,其中包含用户:“mike”、“joe”和“dave”)。

我想做的是 - 每次用户想进入我的 Angular.js 客户端的聊天室(有一些房间名称)时,我想:

  1. 如果房间不存在则创建房间
  2. 将该用户推送到房间的用户数组中。

我知道,因为 1,我将始终拥有一个拥有大量用户的房间。

这是我的 Angular 相关代码:(我不能在这里给出整个应用程序,因为它太大而且不相关。)

$scope.enterRoom = function(info) {
$q.when(create_room_if_not_exists($scope.room)).then(add_user_to_room($scope.name, $scope.room));
$location.path("chat");
}


var create_room_if_not_exists = function(room_name) {
var deferred = $q.defer();
is_room_already_exists({
'name': room_name
}).then(function(response) {
if (!response.data.is_room_exists) {
register_room({
'name': room_name
});
console.log("room: " + room_name + ", was created");
deferred.resolve();
}
}, function(error) {
deferred.reject(error.data);
});
return deferred.promise;
}

var add_user_to_room = function(user_name, room_name) {
console.log(user_name)
add_user_to_room_request({
'user_name': user_name,
'room_name': room_name
});
}

var is_room_already_exists = function(info) {
return $http({
url: '/is_room_already_exists',
method: 'POST',
data: info
});
}

var add_user_to_room_request = function(info) {
$http({
url: '/add_user_to_room',
method: 'POST',
data: info
});
}

var register_room = function(info) {
return $http({
url: '/register_room',
method: 'POST',
data: info
});
}

发生的是第二个 Action 发生在第一个 Action 之前。当我将日志打印到控制台时,我看到了,但我不知道为什么。

这两个操作都是通过对服务器的 HTTP 请求到达的 - 所以我认为问题不在那里。

最佳答案

I am talking about the XHRs not chaining

链接问题的一个常见原因是未能将 promise 返回给链:

var add_user_to_room = function(user_name, room_name) {
console.log(user_name)
//add_user_to_room_request({
return add_user_to_room_request({
//^^^^^^ ----- be sure to return returned promise
'user_name': user_name,
'room_name': room_name
});
}

如果链接正确完成,则不需要$q.defer:

var create_room_if_not_exists = function(room_name) {
//var deferred = $q.defer();
//is_room_already_exists({
return is_room_already_exists({
//^^^^^^ --- be sure to return derived promise
'name': room_name
}).then(function(response) {
if (!response.data.is_room_exists) {
console.log("room: " + room_name + ", to be created");
//register_room({
return register_room({
//^^^^^^ ----- return promise to further chain
'name': room_name
});
//deferred.resolve();
} else {
return room_name;
//^^^^^^ ----- return to chain data
};
}, function(error) {
//deferred.reject(error.data);
throw error;
//^^^^^ ------- throw to chain rejection
});
//return deferred.promise;
}

如果一个 promise 被正确返回,$q.when 就不是必需的:

$scope.enterRoom = function(info) {
//$q.when(create_room_if_not_exists($scope.room))
// .then(add_user_to_room($scope.name, $scope.room));
return create_room_if_not_exists($scope.room)
.then(function() {
return add_user_to_room($scope.name, $scope.room));
}).then(function()
$location.path("chat")
});
}

函数式编程的经验法则是 -- 总是返回一些东西

因为调用 promise 的 .then 方法会返回一个新的派生 promise,所以很容易创建一个 promise 链。可以创建任意长度的链,并且因为一个 promise 可以用另一个 promise 解决(这将进一步推迟其解决),可以在链式,链条。这使得实现强大的 API 成为可能。

-- AngularJS $q Service API Reference - Chaining Promises .

关于angularjs - Node.js + Angular.js promise 同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com