bluebird 中 new Promise 和 Promise.resolve/reject 的区别
Difference between new Promise and Promise.resolve/reject in bluebird
我调用 storage.createTask 并使用 BlueBird 的承诺来获取返回值。当我执行 new Promise()
并使用 resolve(something)
或 reject(error)
解决承诺时,这很好用。然而,Promise.reject(new Error('some error'))
导致 cannot read property 'then' of undefined
.
根据文档,Promise.reject
Creates a promise that is rejected with the given reason
。这不是类似于reject(error)
吗?
Promise.resolve/Promise.reject
和做new 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);
}
}
您的 createTask()
函数没有 return 任何东西;您需要 return 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);
});
}
通过此重写,您总是 return 从 createTask()
获得承诺,因此您可以安全地链接它。
我调用 storage.createTask 并使用 BlueBird 的承诺来获取返回值。当我执行 new Promise()
并使用 resolve(something)
或 reject(error)
解决承诺时,这很好用。然而,Promise.reject(new Error('some error'))
导致 cannot read property 'then' of undefined
.
根据文档,Promise.reject
Creates a promise that is rejected with the given reason
。这不是类似于reject(error)
吗?
Promise.resolve/Promise.reject
和做new 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);
}
}
您的 createTask()
函数没有 return 任何东西;您需要 return 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);
});
}
通过此重写,您总是 return 从 createTask()
获得承诺,因此您可以安全地链接它。