我是否需要从申请的入口点返回承诺?

时间:2018-02-17 14:41:12

标签: node.js promise

在express中,我有以下代码:

public static String getForegroundPackage(UsageStatsManager usageStatsManager) {
    String packageName = null;

    final long INTERVAL = 1000 * 60;
    final long end = System.currentTimeMillis();
    final long begin = end - INTERVAL;
    final UsageEvents usageEvents = usageStatsManager.queryEvents(begin, end);
    while (usageEvents.hasNextEvent()) {
        UsageEvents.Event event = new UsageEvents.Event();
        usageEvents.getNextEvent(event);
        switch (event.getEventType()) {
            case UsageEvents.Event.MOVE_TO_FOREGROUND:
                packageName = event.getPackageName();
                break;
            case UsageEvents.Event.MOVE_TO_BACKGROUND:
                if (event.getPackageName().equals(packageName)) {
                    packageName = null;
                }
        }
    }

    return packageName;
}

但是,我也可以

app.get('/hello', (req, res) => {
    return controller.doSomthingAsync(req).then(() => {
        res.send({message: "Hello World"});
    })
});

以上也有效,但我想知道两种方法之间是否存在差异,第二种方法是否会引起任何问题?

2 个答案:

答案 0 :(得分:0)

不,你不需要从快递路线返回承诺,因为快递不知道如何处理承诺(遗憾!)。

但是,每次调用promise-returns函数并且不进一步链接并将其返回给调用者时,即当你结束一个promise链时,你有责任处理它的错误。所以做

是合适的
app.get('/hello', (req, res) => {
    controller.getMessageAsync(req).then(msg => {
        res.status(200).send(msg);
    }, err => {
        console.error(err);
        res.status(500).send("Sorry.");
    });
});

答案 1 :(得分:0)

考虑到您提供的代码段,使用这两个版本没有区别。

return的唯一好处是你之后放的任何一段代码都不会被执行。例如,假设以下代码:

app.get('/hello', (req, res) => {
    if (req.query.foo === 'bar') {
        controller.doSomethingAsync(req).then(() => {
            res.send({message: "Hello World"});
        }).catch(err => {
            console.log(err);
            res.status(500).send(err);
        });
    }

    controller.doSomethingElseAsync(req).then(() => {
        res.send({message: "Hello Universe"});
    }).catch(err => {
        console.log(err);
        res.status(500).send(err);
    });
});

这将产生错误,因为将执行两个异步操作并尝试发送响应。 在return块中添加if会阻止执行第二次异步操作和错误。

app.get('/hello', (req, res) => {
    if (req.query.foo === 'bar') {
        return controller.doSomethingAsync(req).then(() => {
            res.send({message: "Hello World"});
        }).catch(err => {
            console.log(err);
            res.status(500).send("Error");
        });
    }

    controller.doSomethingElseAsync(req).then(() => {
        res.send({message: "Hello Universe"});
    }).catch(err => {
        console.log(err);
        res.status(500).send("Error");
    });
});

编辑:正如Bergi指出的那样,使用else也可以完成这项工作并避免返回表达无法处理的内容。

app.get('/hello', (req, res) => {
    if (req.query.foo === 'bar') {
        controller.doSomethingAsync(req).then(() => {
            res.send({message: "Hello World"});
        }).catch(err => {
            console.log(err);
            res.status(500).send("Error");
        });
    } else {
        controller.doSomethingElseAsync(req).then(() => {
            res.send({message: "Hello Universe"});
        }).catch(err => {
            console.log(err);
            res.status(500).send("Error");
        });
    }
});