Javascript承诺过早解决

时间:2017-04-17 11:24:20

标签: javascript mongodb promise

我有一个返回Promise的函数,它访问数据库并拉出几行,将它们分配给一个Javascript变量。

问题是我的'然后'即使我知道承诺没有得到解决,也会触发条款:

app.post("/api/hashtag", function (req, res) {

FindPopularRumours().then(function (resolveVar) {
    console.log(resolveVar);
    console.log();
    res.send(resolveVar);
}).catch(function () {
    console.log("DB Error!");
    res.send("DB Error!");
});
});

承诺功能:

function FindPopularRumours() {
return new Promise((resolve, reject) => {
    var hashtags = [];
    var dbPromise;

    db.collection(HASHTAGS).find().forEach(function (doc) {
        hashtags.push(doc.hashtag);
        console.log(hashtags);
    });
    resolve(hashtags);
});
}

结果输出为:

  

[]

     

['#TEST1']

  [' #test1',' #test2']

  [' #test1',' #test2',' #test3']

如您所见,第一行(' []')只应在输出主题标签后执行。但出于某种原因,我的代码似乎认为Promise在它实际存在之前就已经解决了。

EDIT1

根据Ankit的建议,我已将我的功能修改为:

function FindPopularRumours() {
return new Promise((resolve, reject) => {
    var hashtags = [];

    db.collection(HASHTAGS).find({}, function (err, doc) {
        if (!err) {
            doc.forEach(function (arg) {
                hashtags.push(arg.hashtag);
                console.log(hashtags);
            });
            resolve(hashtags);
        } else {
            return reject(err);
        }
    });
});
}

这仍然会返回与之前相同的输出响应(例如,'然后'子句在promise本身之前运行)。

我的POST功能仍然与之前相同。

2 个答案:

答案 0 :(得分:1)

db.collection.find()函数是异步的,因此您必须解决内部的回复,例如

function FindPopularRumours() {
    return db.collection(HASHTAGS).find().toArray().then( (items) => {
        return items.map( doc => doc.hashtag);
    });
}

利用Mongo toArray()方法,直接返回一个承诺

答案 1 :(得分:0)

请注意db.collection(HASHTAGS).find()是异步调用。因此,您的承诺在数据库查询返回之前得到解决。要解决此问题,您需要重新编写数据库查询,如下所示:

function FindPopularRumours() {
    return new Promise((resolve, reject) => {
       var hashtags = [];
       var dbPromise;

       db.collection(HASHTAGS).find({}, function(err, doc){
           if(!err){
              doc.forEach(function (arg) {
                  hashtags.push(arg.hashtag);
                  console.log(hashtags);
              });
              resolve(hashtags);
           }else{
               return reject(err);
           }
       });
   });
}

希望答案可以帮到你!