Nodejs模块async.series不工作(以后的函数在上一个函数之前执行)

时间:2016-07-02 18:31:54

标签: javascript node.js asynchronous

Code

Server.js result

我的代码就是这个

app.post('/get_page_data', function(req, res) {
function find (i,documents)
{
    Item_data.find({item_name:documents[i].item_name}).exec(function (err,asd){
            console.log(documents[i].item_name+": found");
            console.log(asd[0].like);

    }
    )
}
Page_data.find().lean().exec(function (err, documents) {
var doc=documents;

async.series([
// 1st
function(done){
    for(var i=0;i<documents.length;i++)
{

    find(i,doc);
    done()
}
},
// 2nd
function(done){
    console.log("1");
    console.log(doc);
    console.log("2");
    res.end(JSON.stringify(doc));
    console.log("3");
    done()
}
]);


}
)});

我将简单地介绍我的代码 当ajax调用/ get_page_data时 我将页面数据(第1页,第2页,第3页......)带入文档中 每个页面都有一个item_name,但页面数据没有&#34;喜欢&#34;数据 所以我找到&#34;的价值,像#34;在另一个集合(Item_data)中使用相同的项目名称并放入&#34; like&#34;在页面数据文件中

但这让我发疯了 页面数据在我输入类似值之前发送

所以我读到了非阻塞io和异步blahblah ...... 然后我找到了异步模块。并使用它。 但是,正如你可以看到上面的图片,他们没有工作

(在尝试异步模式之前,他们既没有工作也没有)

我不知道为什么res.end以前会帮助你,请告诉我这种情况的解决方法谢谢你的阅读

updated result

2 个答案:

答案 0 :(得分:2)

您的find函数正在进行异步调用,因此在返回任何数据之前调用done()。 你应该在内部的find回调中移动它。

修改:直接使用async.each代替async.series

app.post('/get_page_data', function(req, res) {
  function find (document, cb) {
    Item_data.find({item_name:document.item_name}).exec(function (err,asd) {
      console.log(document.item_name+": found");
      console.log(asd[0].like);
      cb();
    })
  }

  Page_data.find().lean().exec(function (err, documents) {
    var doc=documents;
    async.each(documents,
    // 1st
    find(document, cb), 
    // 2nd
    function() {
      console.log("1");
      console.log(doc);
      console.log("2");
      res.end(JSON.stringify(doc));
      console.log("3");
    });
 }
)});
PS:在这段代码中你还应该改进很多东西。但那样它应该有效。

答案 1 :(得分:0)

enter image description here

将完成的东西放在aysn函数中,并在索引值

时调用done
    app.post('/get_page_data', function(req, res) {
        function find (i,documents,cb)
        {
            Item_data.find({item_name:documents[i].item_name}).exec(function (err,asd){
                    console.log(documents[i].item_name+": found");
                    console.log(asd[0].like);
                    console.log(i +"/"+ documents.length);
                    documents[i]["like"]=asd[0].like;
                    if(i==documents.length-1) cb();
                        //call done() when the index reached maximum

            })

        }
    Page_data.find().lean().exec(function (err, documents) {
        var doc=documents;

    async.series([
        // 1st
        function(done){
            for(var i=0;i<documents.length;i++)
        {
            find(i,doc,done); //put the done thing inside the function
        }
        },
        // 2nd
        function(done){
            console.log("1");
            console.log(doc);
            console.log("2");
            res.end(JSON.stringify(doc));
            console.log("3");
            done()
        }
    ]);

enter image description here

正常工作