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

标签 javascript asynchronous promise

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

    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/

相关文章:

javascript - 我如何跟踪 FS 被 emscripten 包含的原因?

javascript - 如何在 Canvas 下使用 HTML 元素

javascript - 使用 mongoose find() 函数时,我收到 Promise <Pending>

javascript - 为什么在 React js 中组件没有被渲染?

javascript - JQuery 自动完成返回空白结果

javascript - 在异步 XMLHttpRequest 的数据可用后执行代码

javascript - Express 中间件中的 Axios 出现错误 - 发送 header 后无法发送 header

python - 订阅 Tornado 事件

javascript - 条件/动态数组 promise 所有

javascript - 异步等待无法正常工作