急问,await is not defined

78 views
Skip to first unread message

Zi LI

unread,
Mar 26, 2012, 9:43:51 AM3/26/12
to js...@googlegroups.com
大家好,一直在等赵老师回信,这个问题比较着急,希望热心人回答一下
现在编写的一个node.js project想运用您的Jscex遇到一个问题,
我需要多次查询数据库,但是异步不能整合最终的结果。我需要把最后的数据要一起返回到网页上。不知道您的jscex有没有办法获取结果数据的?
我看你有
var printAsync = eval(Jscex.compile("async", function (text) {}));这个是返回的task吧
var data = $await(fs.readFileAsync(path))这个是返回的数据吗?


以下是我的code例子。 requestEngine.
search是我的查询数据库方法,data是callback的数据。
searchAsync = (query) ->
    return Task.create((t) ->
        requestEngine.search(query, (data) ->
            t.complete("success", data);
        )
    )

然后我希望用$await调用,返回所有数据,但是报错说$await is not defined,而我按说明require了所有的,见信尾。您知道原因吗?
alldata=[]
for query in allquery
               data = $await(searchAsync query)
               alldata.push(data)

是这个方法不对吗?我看到网上有人引用您的例子var data = $await(Task.whenAll({ profile: api.getUser("username"), timeline: api.getTimeline("username")}))
这个是返回的数据吧。然后针对我的方法  requestEngine.search(query, dataCallBack)我应该怎么写成相应的Jscex异步方法
searchAsync = eval(Jscex.compile("async", requestEngine.search(query, dataCallBack {}))这样是不行的

非常感谢大家的帮忙
ZILI

require部分
var Jscex = require("jscex"); require("jscex-jit").init(Jscex); require("jscex-async").init(Jscex); require("jscex-async-powerpack").init(Jscex)


--
Zi Li

AgroParisTech

16 rue Claude Bernard
F-75231 Paris Cedex 05

Mobile : (33)  06 88 46 78 95

www.paristech.fr

Jeffrey Zhao

unread,
Mar 26, 2012, 10:40:01 AM3/26/12
to js...@googlegroups.com
说的有点乱,没看明白。
 
其实既然你已经有了requestEngine.search,那么只要:
 
requestEngine.searchAsync = Jscex.Async.Jscexify.fromCallback(requestEngine.search);
 
然后就能用了。你到底是怎么用的,把使用$await的完整方法贴一下。
 
Jscex很容易用的,看看这系列文章吧:
 
 
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn (Chinese) | @jeffz_en (English)

Zi LI

unread,
Mar 26, 2012, 10:50:47 AM3/26/12
to js...@googlegroups.com
谢谢您的回复我就是接下来调用
requestEngine.searchAsync = Jscex.Async.Jscexify.fromCallback(requestEngine.search)

for query in allquery
                data = $await(requestEngine.searchAsync query)
但是一直说$await is not defined

我的意思是,我需要返回每次数据库查询的结果,这个方法可行么?我准备把所有的结果放到array里


2012/3/26 Jeffrey Zhao <je...@live.com>

Zi LI

unread,
Mar 26, 2012, 10:57:06 AM3/26/12
to js...@googlegroups.com
$await我就是紧接着写了requestEngine.searchAsync就在这个循环里用了一下,一直说$await is not defined.
其他的code都是与Jscex无关的,建立query的
for query in allquery
                data = $await(requestEngine.searchAsync query)


requestEngine.search函数如下
search: (query, dataCallback) ->  
        @elasticSearchClient.search("logs", "", query)
            .on('data', (data) ->
                dataCallback(data)
            )
            .exec()

2012/3/26 Jeffrey Zhao <je...@live.com>

Jeffrey Zhao

unread,
Mar 26, 2012, 11:08:55 AM3/26/12
to js...@googlegroups.com
还是说地太乱,实在不清楚你是怎么用的,能不能系统点地讲,或者先看看我的文章,写个最简单的例子出来?
 
有没有跑过最简单的例子呢?就samples目录里的那些。

Jeffrey Zhao

unread,
Mar 26, 2012, 11:13:44 AM3/26/12
to js...@googlegroups.com
我写一段代码,不知道是不是你想要的,我实在听不懂你在说什么:
 
requestEngine.searchAsync = Jscex.Async.Jscexify.fromCallback(requestEngine.search);
 
var loadDataAsync = eval(Jscex.compile("async", function () {
    var dataList = [];
 
    for (var m in allQuery) {
        var query = allQuery[m];
        var data = $await(requestEngine.searchAsync(query));
        dataList.push(data);
    }
 
    return dataList;
}));
 
你用的是coffee的话,大致代码结构是一样的,照着写下。
 
总而言之,一定先写个Hello World出来,遇到$await不存在问题基本就是还不知道Jscex是怎么用的……
 
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: @jeffz_cn (Chinese) | @jeffz_en (English)
From: Zi LI
Sent: Monday, March 26, 2012 10:57 PM

Zi LI

unread,
Mar 26, 2012, 11:57:03 AM3/26/12
to js...@googlegroups.com
谢谢您,我试着运行hello world等简单例子是可以的。我运行了您的代码,但是仍旧不知道怎么取得这个dataList,我需要得到在其他程序用到这个dataList,不知道可以吗?

当我运行data = loadDataAsync(),看到data不是dataList,应该是Jscex的任务,但是我想获得最后的datalist

我在这段代码中加上了  console.log dataList 他也没有打印出来。allQuery是有数据的
var loadDataAsync = eval(Jscex.compile("async", function () {
    var dataList = [];
    for (var m in allQuery) {
        var query = allQuery[m];
        var data = $await(requestEngine.searchAsync(query));
        dataList.push(data);
    }
    console.log dataList
    return dataList;
}));

因为我有看到您在网上的日志data.topics = $await(topic_ctrl.get_topics_by_query_async(...))。这里的data是数据吧。

麻烦您了!非常感谢


2012/3/26 Jeffrey Zhao <je...@live.com>

Zi LI

unread,
Mar 26, 2012, 6:50:03 PM3/26/12
to js...@googlegroups.com
补充一下赵老师,我怕您仍旧看不明白,我的router函数如下,indexAsync函数见上封邮件末尾。我这么调用我总的结果,您可以看见,我把res传进indexAsync去,让res.send结果。这样是可行的
router2 = (req, res, next) ->
        indexAsync(id, report, res).start()
server = Restify.createServer()
server.get path2, router2


如果我希望在router2里直接拿取到 indexAsync的结果进行操作,就必须把router2改成
router2Async = eval(Jscex.compile("async", (req, res, next) ->
             data = $await(getResultsReportAsync(id, report, res))
            res.send data))

server.get path2, router2Async.start()
但是这样是行不通的,他报错Task can only be started in \"ready\" status
我想知道除了把一函数定义成Jscex异步函数,再在其中用$await获取数据,还有别的方法吗?
我调用一个Jscex异步函数除了start还有什么?

非常感谢您,希望我能够表示得比前几次好一点。如果您哪个地方觉得我没说清楚的话,可以告诉我。

zili
      
2012/3/26 Zi LI <auror...@gmail.com>
您好,赵老师,我已经用您的方法做出来了代码在下边,您的方法非常好。但是我更感兴趣的是,我能否在回调函数或者Jscex异步方法外获得每次查询所得结果,就像我上封信里说的怎么获得datalist呢?我的意思是,比如现在要在一个Jscex方法里用 Results = $await(loadDataAsync allquery)获取数据Results如果不在Jscex方法里是没有办法使用$await对吗?还有我需要使用一个Jscex方法,必须要用start()?比如我在路由里这样调用indexAsync(id, report, res).start()。我把res作为参数传给了indexAsync去操作结果,让他把结果发到网页。

但是如果我能把结果比如dataList从
indexAsync里提取出来,而不是indexAsync里操作结果。我希望直接在其他地方操作这个结果。您能明白我的意思吗?请问Jscex或者node.js有这样的方法吗?
麻烦您了,不胜感激!我的代码如下

loadDataAsync = eval(Jscex.compile("async",  (allquery) ->
        dataList = []
        console.log 'query'
        console.log allquery

        for query in allquery
            data = $await(requestEngine.searchAsync query)
            dataList.push(data)
        return dataList))



loadPathNameAsync = eval(Jscex.compile("async",  (allquery) ->
    data = $await(loadDataAsync allquery)
    pathNameList = []

    pathListWithCount = data[0].facets.pathList.terms
    for eachPath in pathListWithCount
        pathName = eachPath.term
        pathNameList.push pathName
    return pathNameList
    ))


indexAsync = eval(Jscex.compile("async", (id, report, res) ->
    build = new BuildQuery(id)
    allquery = build.getQueryFromReport(id, report)   
    result = {}
    result.AllOthers_Results = $await(loadDataAsync allquery)

    must_array = build.getMustArrayOfPath report
    if must_array isnt []
        must_array = build.getMustArrayOfPath report           
        queryPath = build.getPathQuery(id, must_array)
        queries = [queryPath]
        pathNameList = $await(loadPathNameAsync queries)
   
        allquery_progress=[]
        for pathName in pathNameList
            query_array = build.getProgressQuery(pathName)
            for eachquery in query_array
                allquery_progress.push eachquery

        result.ProgressData = $await(loadDataAsync allquery_progress)
   
    res.send result))



2012/3/26 Jeffrey Zhao <je...@live.com>

Zi LI

unread,
Mar 26, 2012, 2:30:43 PM3/26/12
to js...@googlegroups.com
您好,赵老师,我已经用您的方法做出来了代码在下边,您的方法非常好。但是我更感兴趣的是,我能否在回调函数或者Jscex异步方法外获得每次查询所得结果,就像我上封信里说的怎么获得datalist呢?我的意思是,比如现在要在一个Jscex方法里用 Results = $await(loadDataAsync allquery)获取数据Results如果不在Jscex方法里是没有办法使用$await对吗?还有我需要使用一个Jscex方法,必须要用start()?比如我在路由里这样调用indexAsync(id, report, res).start()。我把res作为参数传给了indexAsync去操作结果,让他把结果发到网页。

但是如果我能把结果比如dataList从
indexAsync里提取出来,而不是indexAsync里操作结果。我希望直接在其他地方操作这个结果。您能明白我的意思吗?请问Jscex或者node.js有这样的方法吗?
麻烦您了,不胜感激!我的代码如下

loadDataAsync = eval(Jscex.compile("async",  (allquery) ->
        dataList = []
        console.log 'query'
        console.log allquery
        for query in allquery
            data = $await(requestEngine.searchAsync query)



2012/3/26 Jeffrey Zhao <je...@live.com>
我写一段代码,不知道是不是你想要的,我实在听不懂你在说什么:

Jeffrey Zhao

unread,
Mar 26, 2012, 10:30:25 PM3/26/12
to js...@googlegroups.com
看一下文档吧,不要猜。
 
 
还有,既然示例是能跑的,那么从示例开始一点一点修改代码尝试一下吧,不要直接写复杂的例子,或者看下我的文章。
 
不要猜。

Jeffrey Zhao

unread,
Mar 26, 2012, 10:33:26 PM3/26/12
to js...@googlegroups.com
$await只能用在Jscex方法里。
 
Jscex方法执行后得到的是Task对象,它可以在另一个Jscex方法里$await,或者在外部start并通过事件来得到结果。
 
Reply all
Reply to author
Forward
0 new messages