当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavaScript设计模式-处理不需要的异步》经验,为你挑选了1个好方法。

我对基于事件的编程很新(使用node.js).我相信有些东西我只是不喜欢它,因为有一个特殊的问题,我一次又一次地遇到.

简而言之,当问题似乎妨碍你时,这个问题正在处理异步性问题.在我的情况下,这通常表现在与第三方库一起工作时,第三方库在设计上是非阻塞的,并且提升了基于回调的API.

例如:现在我正在写一些大量使用mranney的node-redis库的东西.我的程序正在抓取RSS提要并将结果隐藏到redis中.我正在使用我认为是re​​dis的常见策略:

    抓取Feed,将结果存储为带有类似键的redis哈希值feed::results:.

    存储对最新结果的引用feed::latest.

var redis = require("redis");
var client = redis.createClient();

var get_latest_results = function (feedId) {
    client.get('feed:+ feedId + ':latest', function (err, res) {
        var latest_reading_key = res.toString();
        client.hgetall(latest_reading_key, function (err, res) {
            var latest_reading = res;
        });
    });
    // how do I specify a return value for this function?
}

放置return latest_readingget_latest_results函数的底部失败,因为在函数准备退出之后才定义latest_reading .放置return latest_readinghgetall调用中失败,因为它return引用了回调,并被忽略get_latest_results.

这只是我似乎不断写入的那种情况的一个例子.也许我正试图将方钉钉入圆孔,因为我不知道更好.似乎应该有一种解决这类问题的非黑客方式.



1> Daniel Vassa..:

您正在努力处理异步问题,因为您仍然在同步范例中编写函数.

在异步中,您应该将回调附加到事件.你不应该期望来自异步函数的结果get_latest_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.学会喜欢它.'cos JavaScript没有为您提供语言级原语,如线程或协同程序,您需要能够同步运行异步代码(反之亦然).
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有