gpt4 book ai didi

javascript - 静态 Promise.resolve()/reject() 始终被解释为resolve()

转载 作者:行者123 更新时间:2023-12-03 09:14:52 28 4
gpt4 key购买 nike

我正在使用以下两段代码:

    Store.addUser(newUserInfo).then(function(firstResult) {
Store.getUserList().then(function(result){
console.log('this side');
console.log(result);
io.sockets.emit('userAdded', {
userMapByUserId: result
});
}, function(error) {
console.log('List of users could not be retrieved');
console.log(error);
io.sockets.emit('userAdded', {
userMapByUserId: []
});
}
);
}, function(rejection) {
socket.emit('userNotAdded', {
userId: -1,
message: rejection.reason,
infoWithBadInput: rejection.infoWithBadInput
});
});

在商店:

var addUser = function(newUserInfo) {
var validationResult = Common._validateUserInfo(newUserInfo);
if (validationResult.isOK) {
return keyValueExists('userName', newUserInfo.userName).then(function(userNameAlreadyExists) {
if (userNameAlreadyExists) {
validationResult = {
isOK: false,
reason: 'Username already exists',
infoWithBadInput: 'userName'
};
return Promise.reject(validationResult);
} else {
var newUserId = generateUserId();
//TODO: change it somehting more flexible. e.g. a predefined list of attributes to iterate over
var newUser = {
'userName': newUserInfo.userName,
'password': newUserInfo.password,
'userId': newUserId,
'lastModificationTime': Common.getCurrentFormanttedTime(),
'createdTime': Common.getCurrentFormanttedTime()
};
var user = new User(newUser);
user.save(function(err) {
if (err) {
console.log(err);
console.log('There is a problem saving the user info');
return Promise.reject('There is a problem saving the user info');
} else {
console.log('A new user added: ');
console.log(newUser);
//return getUserList();
return Promise.accept(newUser);
}
});
}
});
} else {
return Promise.reject(validationResult);
}
};

但是在第一个代码中,当我执行Store.addUser(newUserInfo)时,它总是运行第一个函数(解析函数),如果我们返回Promise,则不应该出现这种情况addUser 中的 .reject()。知道为什么会发生这种情况吗?

最佳答案

您的两个 return 语句太少,两个太多,并且忽略了非 promise 函数调用。

Store.addUser(newUserInfo).then(function(firstResult) {
return Store.getUserList().then(function(result){
// ^^^^^^

这并不是真正的问题,因为您不会在生成的 promise 之后链接任何内容,但无论如何都不应该错过它。


return keyValueExists('userName', newUserInfo.userName).then(function(userNameAlreadyExists) {
if (userNameAlreadyExists) {

} else {

var user = new User(newUser);
user.save(function(err) { … });
// ^^^^
}
});

在此 then 回调中,您不会从 else 分支返回任何内容。 promise 会立即通过 undefined 实现,并且正在进行的 save 调用将被忽略 - 您的 promise 不知道这一点,因此他们无法等待它。这就是为什么链中接下来的 Store.getUserList() 看不到更改;它们尚未存储。
这也是为什么回调中的 Promise.reject 被忽略,以及 Promise.accept 从未引起任何问题的原因。

您需要在此处为​​ save 调用的结果创建一个新的 Promise(以便您实际上可以返回它):


var user = new User(newUser);
return new Promise(function(resolve, reject) {
user.save(function(err) {
if (err) {
console.log(err);
console.log('There is a problem saving the user info');
reject('There is a problem saving the user info');
} else {
console.log('A new user added: ');
console.log(newUser);
resolve(newUser);
}
});
}); // .then(getUserList);

关于javascript - 静态 Promise.resolve()/reject() 始终被解释为resolve(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31983670/

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