Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将承诺与Node JS express一起使用_Javascript_Node.js_Express_Promise_Es6 Promise - Fatal编程技术网

Javascript 将承诺与Node JS express一起使用

Javascript 将承诺与Node JS express一起使用,javascript,node.js,express,promise,es6-promise,Javascript,Node.js,Express,Promise,Es6 Promise,我是承诺的新手,我试图理解它们是如何工作的 首先,我的问题是: 当在路由函数中处理请求时,它会等待所有承诺吗?我的意思是,当我使用承诺或回调时,它是一个新的作用域,执行会继续下去 如果我在定时器中保存一个req/res对象,然后响应用户,用户会看到什么?在我显式发送响应之前,请求将被阻止 因此,我遇到了以下问题 这是我的路线 router.post('book', authHandler.provideMiddleware(), (req, res) => { bookMana

我是承诺的新手,我试图理解它们是如何工作的

首先,我的问题是:

  • 当在路由函数中处理请求时,它会等待所有承诺吗?我的意思是,当我使用承诺或回调时,它是一个新的作用域,执行会继续下去

  • 如果我在定时器中保存一个req/res对象,然后响应用户,用户会看到什么?在我显式发送响应之前,请求将被阻止

  • 因此,我遇到了以下问题

    这是我的路线

    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方法,否则调用success

    我这里有几个问题

  • 当抛出错误时,我的书仍然被创建
  • 我有以下错误

    节点:8753)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:6):错误:发送后无法设置头

  • 我想使用像Rx(无功扩展)这样的方法

    有人能解释一下什么是错误的,在这种情况下承诺是如何起作用的吗

    一,。当在路由函数中处理请求时,它会等待所有承诺吗?我的意思是,当我使用承诺或回调时,它是一个新的作用域,执行会继续下去

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

    二,。如果我在定时器中保存一个req/res对象,然后响应用户,用户会看到什么?在我显式发送响应之前,请求将被阻止

    我这里有几个问题

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

    无论数据是否被验证为正确,您总是开始创建书籍的过程<代码>新承诺开始工作

    二,。我有以下错误

    节点:8753)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:6):错误:发送后无法设置头

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

    你可以摆脱保存这本书的整个
    newpromise
    ,只需将它放入
    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);
            });
    }
    
    在这里,我假设
    createBookFromRequest
    checkBookData
    都是同步过程,因为这就是您使用它们的方式

    事实上,如果是这样的话,我认为你没有必要做出承诺来验证数据。因此它可以更简单:

    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");
        }
    }
    

    回答得好!我只想插入一条注释,说明可以将
    verifyData.then(()=>book.save())
    重写为
    verifyData.then(book.save).then(…)
    ,不过我很确定您有意省略了它,以使示例更加清晰!但是,对于OP来说,了解它总是有用的!:)@丹尼尔:可能不是:
    。然后(book.save)
    将调用
    book.save
    ,并在调用过程中将
    设置为
    未定义。但它大概需要将
    这个
    设置为
    book
    。另一个选项是
    。然后(book.save.bind(book))
    ,但我发现箭头函数更清晰。(
    bind
    对于避免创建闭包非常有用。)当然,Doh!我在那里读代码读得太快了,从来没有意识到它不是一个保存函数,将已解析的书作为参数!谢谢T.J@丹尼尔布:对不起,忘记说“谢谢”了,谢谢你对答案的赞美!(我把太多精力放在
    上了,然后
    的事情上。:-)代码仍然存在与中相同的问题