如何使用Promise.all使其正常工作?

时间:2018-07-09 11:49:17

标签: node.js post get promise ejs

我的主要目的是使此功能起作用:

每当用户单击“喜欢”按钮或“喜欢”按钮时,它将向服务器发布新数据,然后服务器应该更新数据库中“喜欢”和“喜欢”的数量。之后,它将重定向到另一个URL,以获取具有新更新的“喜欢”和“不喜欢”数量的上一页。

在此过程中,由于JS的异步影响,我决定使用Promise.all。但是我陷入了那部分(在我的代码中用3个问号标记)。有人可以帮我修改它或给我更好的建议吗?

这是我的Node.js代码:

app.post("/searchresult/comments/likes", function(req, res) {
var likes = req.body.likes;
var dislikes = req.body.dislikes;
var Text = req.body.text;
var Arr = [likes, dislikes];

Promise.all(Arr.map(function (attribute) {
    return new Promise(function (resolve, reject) {
        comments.update({text: Text}, {$set: {???: attribute}}, function(err){
            if (err) {
                console.log(err);
            } else {
                console.log("Update successfully!");
                resolve(comments);
            }
        });
}).then(function(r){
    console.log("DONE!");
    res.redirect("/searchresult");
})
}));
});

// ********************************************* ****更新! **************************************************** //

非常感谢Ganesh Karewad,James和dasfdsa。我已经使其正常工作。

2 个答案:

答案 0 :(得分:0)

很抱歉,误解了Q。 您可以事先准备数组。

let likeObj = {like:req.body.likes};
let dislikeObj = {dislike:req.body.dislikes};

let Arr = [likeObj, dislikeObj];

Promise.all(Arr.map(function (attribute) {
    return new Promise(function (resolve, reject) {
        comments.update({text: Text}, {$inc: attribute}, function(err){
            if (err) {
                console.log(err);
            } else {
                console.log("Update successfully!");
                resolve(comments);
            }
        });
})

答案 1 :(得分:0)

使用对象数组代替直接值,例如      var Arr = [{key:'likes',value:likes},{key:'dislikes',value:dislikes}];

 app.post("/searchresult/comments/likes", function(req, res) {
    var likes = req.body.likes;
    var dislikes = req.body.dislikes;
    var Text = req.body.text;
    var Arr = [{key:'likes',value:likes},{key:'dislikes',value:dislikes}];

    Promise.all(Arr.map(function (attribute) {
    return new Promise(function (resolve, reject) {
        comments.update({text: Text}, {$set: {attribute.key: attribute.value}}, 
         function(err){
            if (err) {
             // reject or log error according to need
                console.log(err);
             // reject(err);
            } else {
                console.log("Update successfully!");
                resolve(comments);
             }
          });
      }).then(function(r){
       console.log("DONE!");
       res.redirect("/searchresult");
      }).catch(function(err){
      // reject or log error according to need
      // console.log(err);
       reject(err);
      })
     }));
    });