以下代码片段是一个nodeJS控制器方法,用于调用返回延迟promise的服务。我试图了解处理多个存在点的最佳方法。
例如,如果服务返回一个空对象,我希望promise链存在,并将响应“Nothing found here”返回给用户。如果它找到了某些东西,它会从步骤1移动到承诺链中的下一个项目,即步骤2.
从我的测试中,它似乎返回了json响应,然后进入下一个逻辑步骤,即第2步。这个逻辑现在无法在服务中处理,即如果没有找到任何项目返回错误。< / p>
module.exports.show = function (req, res) {
service.getItem(itemId)
.then(function (item) {
if (!item) {
return res.json('Nothing found here');
}
// Step 1
// do some work on the item
return item;
})
.then(function (foundItem) {
// Step 2
// do some more work on the item
return res.json('Item has changed ' + foundItem);
})
.catch(function (err) {
return res.json(err);
});
};
答案 0 :(得分:2)
尝试以下代码。 catch处理程序捕获错误。我也改变了if子句(我假设你的意思是真的):
module.exports.show = function (req, res) {
service.getItem(itemId)
.then(function (item) {
if (!item) {
throw new Error('Nothing found here');
}
// Step 1
// do some work on the item
return item;
})
.then(function (foundItem) {
// Step 2
// do some more work on the item
return res.json('Item has changed ' + foundItem);
})
.catch(function (err) {
return res.json(err);
});
};
答案 1 :(得分:0)
请记住then
总是返回一个承诺。如果您自己没有返回承诺,则会自动使用返回值创建已解决的承诺。
因此,return res.json('Nothing found here')
与return Promise.resolve(res.json('Nothing found here'));
相同,这意味着,显然可以调用下一个then
。
如果您不想执行下一个,那么您只需拒绝承诺:
throw new Error('Nothing found here'));
// ...
.catch(function (err) {
return res.json(err.message);
});
顺便说一下,你可能意味着if (!item)
,而不是if (item)
:
if (!item) {
throw new Error('Nothing found here');
}
答案 2 :(得分:0)
如果步骤1和2是同步的,那么:
module.exports.show = function (req, res) {
service.getItem(itemId).then(function (item) {
if (!item) {
throw new Error('Nothing found here'); // this will be caught below
}
item = doWork_2(doWork_1(item)); // Steps 1 and 2:
return res.json('Item has changed ' + item);
}).catch(function (err) {
return res.json(err.message);
});
};
其中doWork_1()
和doWork_2()
都返回已处理的item
。
如果步骤1和2是异步的,那么:
module.exports.show = function (req, res) {
service.getItem(itemId).then(function (item) {
if (!item) {
throw new Error('Nothing found here'); // this will be caught below
} else {
return doWork_1(item).then(doWork_2); // Step 1, then Step 2
}
})
.then(function (item) {
return res.json('Item has changed ' + item);
}).catch(function (err) {
return res.json(err.message);
});
};
其中doWork_1()
和doWork_2()
返回已使用已处理的item
解决的承诺。
如果不确定doWork_1()
和.doWork_2()
是同步还是异步,那么使用以下模式,它将处理两种可能性:
module.exports.show = function (req, res) {
service.getItem(itemId).then(function (item) {
if (!item) {
throw new Error('Nothing found here'); // this will be caught below
} else {
return item;
}
})
.then(doWork_1) // Step 1
.then(doWork_2) // Step 2
.then(function (item) {
return res.json('Item has changed ' + item);
}).catch(function (err) {
return res.json(err.message);
});
};