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

时间:2015-08-13 08:54:45

标签: 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)时,它总是运行第一个函数(解析函数),如果我们在return Promise.reject()addUser,则不应该这样。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

你有两个return语句太少,两个太多,并且忽略了一个非保守的函数调用。

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

这个并不是真正的问题,因为你不会在最终的承诺之后链接任何东西,但不管怎么说都不应该错过。

…
return keyValueExists('userName', newUserInfo.userName).then(function(userNameAlreadyExists) {
    if (userNameAlreadyExists) {
        …
    } else {
        …
        var user = new User(newUser);
        user.save(function(err) { … });
//      ^^^^
    }
});

在此then - 回调中,您没有从else分支返回任何内容。承诺立即通过undefined实现,并且正在进行的save调用被忽略 - 您的承诺不知道它,因此他们无法等待它。这就是为什么链中接下来的Store.getUserList()看不到变化的原因;他们还没有存放 这也是为什么忽略了回调中Promise.reject的原因,以及为什么Promise.accept从未造成任何问题。

您需要在此处为​​save调用的结果创建一个新承诺(这样您实际上可以return):

…
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);