2015-09-23 25 views
0

我调用storage.createTask并使用BlueBird的promise来获取返回的值。这个工作正常,当我做new Promise()并解决承诺使用resolve(something)reject(error)。但是,Promise.reject(new Error('some error'))导致cannot read property 'then' of undefined新的Promise和Promise.resolve之间的区别/拒绝蓝鸟

根据该文档,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

http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

你的'createTask()'函数是否应该因为没有什么东西可以接受你在这个功能中被拒绝的承诺,就像你现在拥有它一样,这是没有意义的。 – jfriend00

回答

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()返回一个承诺,所以你可以放心连锁关闭它。

+0

谢谢,我在输入这个问题时不小心遗漏了一个'return _create(task);'行。但是,这已经在我的代码中了,'return Promise.reject'似乎没有返回一个有效的Promise对象 –

+0

@YanYi:对。但是你只是从'else'块中返回,而不是'if'块。如果'task.milestone_id!= null'为'true',那么你不会从'createTask'返回任何东西。这就是'undefined'的来源。它与'Promise.reject'没有任何关系(它不能因为'.then'的工作方式,'.then'总是返回一个promise,不管这个回调是什么)。 –