我需要同步实现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,并且顶级方法在其结果可用之前返回。: -
那么为什么在执行第二阶段之前会退出async.series块? 也就是说,为什么消息4.不在我的跟踪消息的末尾?
提前多多感谢
答案 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)