Promise:当它内部的动作完成时返回then()

0 javascript node.js promise express sequelize.js

我正在使用React-Redux-Express,我正在尝试上传图像express-fileupload.以下是我在Express服务器上传图像的逻辑:

在我的快车路线中,我使用Sequelize

router.put('/:id', function(req, res, next) {
    models.Projects.update(
        {
            title: req.body.title,
            img: req.body.img,
            description: req.body.description,
        },
        {
            returning: true,
            plain: true,
            where: {
                id: req.params.id,
            },
        }
    )
        .then(() => { 
            if (req.files) {
                req.files.imgFile.mv(toRelative(req.body.img), function(err) { 
                    if (err) {
                        throw new Error('Image saving failed');
                    }
                });
            }
        })
        .then(() => { 
            models.Projects.findById(req.params.id).then((result) => {
                return res.send({
                    Project: result,
                });
            });
        })
        .catch((error) => {
            return res.send(String(error));
        });
});
Run Code Online (Sandbox Code Playgroud)

问题是thenreq.files.imgFile.mv方法完成移动图像之前触发了最后一个,因此React输入组件无法在前端找到它.

有谁知道如何在第一个内部创建一个承诺then,所以只有当req.files.imgFile.mv完成移动图像时才会触发第二个?

谢谢!

Cer*_*nce 5

当你有基于回调的东西而不是基于Promise的一般想法是显式构造一个Promise,以便它可以在更大的Promise链中使用:

.then(() => { 
  if (!req.files) return; // resolve immediately if there are no files
  return new Promise((resolve, reject) => {
    req.files.imgFile.mv(toRelative(req.body.img), function(err) { 
      if (err) return reject('Image saving failed');
      resolve();
    });
  });
})
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,省略回调函数以强制req.files.imgFile.mv(返回Promise自身会更容易:

.then(() => { 
  // if there are files, then the outer Promise chain will wait
  // for the returned Promise to resolve before continuing with the next .then:
  if (req.files) return req.files.imgFile.mv(toRelative(req.body.img));
})
Run Code Online (Sandbox Code Playgroud)