使用Node JS express的promises

时间:2017-05-10 07:40:17

标签: javascript node.js express promise es6-promise

我是承诺的新手,我正在努力了解它们是如何运作的。

首先是我的问题:

  1. 当在路由功能中处理请求时,它是否等待所有承诺,我的意思是当我使用promise或回调时,它是一个新的范围并继续执行。

  2. 如果我在计时器中保留req / res对象,然后响应用户,用户会看到什么?在明确发送回复之前,请求才会被阻止?

  3. 所以我遇到了以下问题。

    这是我的路线。

    router.post('book', authHandler.provideMiddleware(), (req, res) => {
          bookManager.createBook(req.body, {
                onSuccess: function (data) {
                   respondSuccess(res,HttpStatus.OK, {'data': data});
                },
                onError: function (message) {
                    respondError(res, HttpStatus.HTTP_STATUS.BAD_REQUEST, {'error': message});
                }
            });
    });
    

    内部的bookmanager我有以下

      createBook(data, hook) {
            let book = createBookFromRequest(data);
            let verifyData = new Promise((resolve, reject) => {
                let valid = checkBookData(book);
                if(valid) {
                   resolve(book);
                }
                else {
                    reject("Invalid data");
                }
            });
            let createBook = new Promise((resolve, reject) => {
                book.save((err, result) => {
                    if (!err) {
                        reject("Error while saving");
                    }
                    else {
                        resolve(result);
                    }
                });
    
            });
            verifyData
                .then(() => {
                    return createBook;
                })
                .then((data) => {
                    hook.onSuccess(data);
                })
                .catch((error) => {
                    hook.onError(error);
                });
        }
    

    我的想法是链接多个函数,如果发生任何错误,请调用hook.onError方法,否则调用成功。

    我有几个问题。

    1. 如果抛出错误,我的图书仍然会被创建。
    2. 我有以下错误

      node:8753)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:6):错误:发送后无法设置标头。

    3. 我想使用像Rx(Reactive Extensions)这样的方法。

      有人可以解释什么是错的,承诺在这种情况下如何真正起作用?

1 个答案:

答案 0 :(得分:2)

  

1。当在路由函数中处理请求时,它是否等待所有promise,我的意思是当我使用promise或callback时,它是一个新的范围并继续执行。

等待您通过res发送回复。您不必为响应事件而这样做,在异步过程(如承诺解析)完成之后,它在以后是绝对正常的。

  

2。如果我在计时器中保留req / res对象然后响应用户,用户会看到什么?在明确发送响应之前,请求才会被阻止?

  

我有几个问题。

     

1。当抛出错误时,我的书仍然被创建。

始终开始创建图书的过程,无论数据是否经过验证都是正确的。 new Promise开始工作。

  

2。我有以下错误

     

node:8753)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:6):错误:发送后无法设置标头。

您正在创建承诺并将其存储在createBook中,如果verifyData拒绝,则永远不会处理对该承诺的拒绝。所以你得到了未经处理的承诺拒绝。

你可以摆脱保存书籍的整个new Promise,然后把它放在verifyData链中;见评论:

createBook(data, hook) {
    let book = createBookFromRequest(data);
    let verifyData = new Promise((resolve, reject) => {
        let valid = checkBookData(book);
        if (valid) {
            resolve(book);
        }
        else {
            reject("Invalid data");
        }
    });
    verifyData
        .then(() => book.save())  // The chain takes on the state of the promise
                                  // returned by `book.save`
        .then(data => {
            hook.onSuccess(data);
        })
        .catch((error) => {
            hook.onError(error);
        });
}

在那,我假设createBookFromRequestcheckBookData都是同步进程,因为这就是你使用它们的方式。

实际上,鉴于这种情况,我认为没有必要为了验证数据而创建承诺。所以它可能更简单:

createBook(data, hook) {
    let book = createBookFromRequest(data);
    if (checkBookData(book)) {
        book.save()
            .then(_ => hook.onSuccess(data))
            .catch(error => hook.onError(error));
    } else {
        hook.onError("Invalid data");
    }
}