蓝鸟中新Promise和Promise.resolve / reject之间的区别

时间:2015-09-23 16:52:18

标签: javascript node.js promise bluebird

我调用storage.createTask并使用BlueBird的承诺来获取返回的值。当我执行new Promise()并使用resolve(something)reject(error)解决承诺时,此方法正常。但是,Promise.reject(new Error('some error'))会导致cannot read property 'then' of undefined

根据文档Promise.reject

  

创建一个因给定原因而被拒绝的承诺

。这不是reject(error),它可以正常工作吗?

Promise.resolve/Promise.rejectnew Promise之间的区别是什么?我们什么时候应该使用另一个?

//server.js

// returning Promise.reject causes
// Cannot read property 'then' of undefined
    storage.createTask(task).then(function(id) {
        task.id = id;
        reply(task);
    }, function(error) {
        console.log(error);
        reply(error);
    });

// storage.js
function _create(task) {
    return new Promise(function(resolve, reject) {
        var id = shortid.generate();
        Task.create({
            id: id,
            content: task.content,
            deadline: task.deadline,
            milestone_id: task.milestone_id,
        }).catch(function (error) {
            reject(error); // works ok
        }).then(function() {
            resolve(id); //works ok
        });
    });
}

module.exports = {
    createTask: function(task) {
        if (task.milestone_id != null ) {
            Milestone.isExist(task.milestone_id).then(function(exists) {
                if (!exists) {
                    return Promise.reject(new Error('some error')); 
                }
                return _create(task);
            });
        } else {
        return _create(task);
        }
    }   

1 个答案:

答案 0 :(得分:1)

你的createTask()函数没有返回任何内容;您需要返回Milestone.isExist()创建的承诺。

<强>更新

以下是我将如何重写该函数:

createTask: function(task) {
    if (task.milestone_id == null ) {
        return Promise.reject(new Error('null id'));
    }

    return Milestone.isExist(task.milestone_id).then(function(exists) {
        if (!exists) {
            return Promise.reject(new Error('some error')); 
        }
        return _create(task);
    });
}

通过这次重写,您总是会从createTask()返回一个承诺,因此您可以安全地将其链接起来。