在节点异步系列块中执行不等待回调触发

时间:2016-01-21 16:13:15

标签: node.js asynchronous

我需要同步实现REST API,以便返回一个对象列表。所以toplevel方法实现如下,其中方法listObjs()应该同步执行,并返回可用的对象,因此可以在REST响应中返回它们。

 var objs= mds.listObjs();
 console.log("Leaving the GET /objs API!! ["+objs+"]");
 res.json({ message :'"Leaving the GET /objs API!! ['+objs+']'})

在方法listObjs()中,我使用async.series将处理分解为阶段,一个接一个地执行。第一阶段将获得对象,第二阶段将处理它们并将一个子集返回给调用者。 getHttpRequest方法在内部使用回调来捕获请求的结果。可以看出,我正在使用此回调来执行异步回调。这应该通知async.series进入下一阶段。

  listObjs : function() {
      async.series([
           function (callback) {
               console.log("Before getHttp");
               getHttpRequest(httpQuery,
                       function(responseStatusCode, objectsJson) {
                               console.log("Now Trigger the next async step")
                               callback(null, objectsJson); // trigger next step
                        });
               console.log("After getHttp");
            },
            function (callback) {
                console.log("Next Step, process the returned Objects");
                callback(null, "2");
            }
        ],
        function (err, result) {
             console.log("At end of async block "+result);
        });
        console.log("Leaving listObjs, SHOULD BE AFTER THE NEXT STEP IS CALLED");
    },

我观察到async.series块不会等到它的回调被调用。相反,执行线程似乎跳出了异步bloc,并且顶级方法在其结果可用之前返回。: -

  1. 在getHttp之前
  2. getHttp
  3. 之后
  4. 离开listObjs,应该在下一步之后被召唤
  5. 离开GET / objs API !! []
  6. 现在触发下一个异步步骤
  7. 下一步,处理返回的Objects,result =
  8. 在async块结束时[{"名称":" obj1"},{"名称":" obj2"}], 2
  9. 那么为什么在执行第二阶段之前会退出async.series块? 也就是说,为什么消息4.不在我的跟踪消息的末尾?

    提前多多感谢

1 个答案:

答案 0 :(得分:1)

输出正确!它们是异步的,它们将在完成自己的任务时执行。这是您的完整代码

def yourPattern(b,s):
    r = ""
    q = [str(k) for k in range(1,b+1)*(s/b)+range(1,b+1)[0:s%b]]
    for k in q:#    ^Iterator[^Array ^Scale^add^Array   ^Portion]
        r += k # Put string together
    return(r)

def pattern(b,l):
    r = ""
    for k in range(1,l+1):
        r+=yourPattern(b,k)+"\n"
    return(r)
print pattern(8,18)