具有promise的nodejs控制器的多个存在点

时间:2015-11-30 17:32:49

标签: javascript node.js express promise

以下代码片段是一个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);
        });
};

3 个答案:

答案 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);
    });
};