JavaScript设计模式——处理不需要的异步

JavaScript设计模式——处理不需要的异步,javascript,asynchronous,node.js,redis,Javascript,Asynchronous,Node.js,Redis,我对基于事件的编程(使用node.js)相当陌生。我相信有些事情我不是在摸索,因为我一次又一次地遇到一个特别的问题 简言之,这个问题是在异步性似乎妨碍您的时候处理它。在我的例子中,这通常在使用第三方库时表现出来,第三方库的设计是无阻塞的,并且促进了基于回调的API 例如:现在我正在写一些大量使用的东西。我的程序正在抓取RSS提要并将结果塞进redis。我正在使用我认为与redis相同的策略: 刮取提要,将结果存储为redis散列,其键类似于feed::results: 将对最新结果的引用存储在f

我对基于事件的编程(使用node.js)相当陌生。我相信有些事情我不是在摸索,因为我一次又一次地遇到一个特别的问题

简言之,这个问题是在异步性似乎妨碍您的时候处理它。在我的例子中,这通常在使用第三方库时表现出来,第三方库的设计是无阻塞的,并且促进了基于回调的API

例如:现在我正在写一些大量使用的东西。我的程序正在抓取RSS提要并将结果塞进redis。我正在使用我认为与redis相同的策略:

  • 刮取提要,将结果存储为redis散列,其键类似于
    feed::results:
  • 将对最新结果的引用存储在
    feed::latest
  • var redis=需要(“redis”); var client=redis.createClient(); var get_最新结果=函数(feedId){ get('feed:+feedId+':latest',函数(err,res){ var latest_reading_key=res.toString(); 客户端.hgetall(最新读取密钥,函数(err,res){ var最新读数=res; }); }); //如何为此函数指定返回值? } 将
    return latest_reading
    放在
    get_latest_results
    函数底部失败,因为直到函数准备退出后才定义最新的_reading。将
    return latest\u reading
    放入
    hgetall
    调用失败,因为
    return
    引用回调,并且被
    get\u latest\u results
    忽略


    这只是一个例子,说明我似乎一直在写我的方式进入的那种情况。也许我是想把方形的钉子敲入圆孔,因为我不知道还有什么更好的。似乎应该有一种非黑客的方法来解决这类问题。

    您正在努力解决异步问题,因为您仍然在以同步范式编写函数

    在异步中,您应该将回调附加到事件。您不应该期望来自异步函数(如
    get\u latest\u results()
    )的结果,但应该将回调函数作为参数传递给它,以便在结果就绪时调用。回调将对您的结果执行任何需要执行的操作:

    var get_latest_results = function (feedId, readyCallback) {
        client.get('feed:' + feedId + ':latest', function (err, res) {
            var latest_reading_key = res.toString();
            client.hgetall(latest_reading_key, function (err, res) {
                readyCallback(res);                           //--- Trigger Callback
            });
        });
        // how do I specify a return value for this function? //--- You don't
    }
    
    然后您可以这样调用您的函数:

    get_latest_results(1000, function (result) {
       //--- Do whatever needs to be done with the latest result...
    });
    

    +1.学会喜欢它因为JavaScript没有提供同步运行异步代码所需的语言级原语,如线程或协同程序(反之亦然)。
    get_latest_results(1000, function (result) {
       //--- Do whatever needs to be done with the latest result...
    });