NodeJ中的简单流量控制

时间:2014-04-06 19:30:59

标签: node.js controls flow

我已经阅读了大量的示例和教程,虽然我知道解决方案可能很简单但我无法让我的脑子缠绕它。这里的任何帮助都会非常感激。

我在Node中有两个函数。 functionA()不带参数,并返回英文字符串。第二个,functionB(英语)从funcitonA()返回英文字符串,并将其翻译成另一种语言。

我认为回调是最好的解决方案,但对于我的生活,我无法弄清楚最佳结构是什么。

提前感谢。

1 个答案:

答案 0 :(得分:0)

我有点不清楚你要做什么(你可能会过分思考)但是请考虑以下内容,这些内容说明了这些功能被调用和调用的四种方式。作为澄清,我应该注意到我没有编写节点样式的回调,它总是采用回调形式(错误,结果),如果没有错误,err的计算结果为false。你不必以这种方式编写自己的回调,尽管我自己也倾向于这样做。

// your 'functionA'
function getMessage(){
    return 'Hello';
};

// your 'functionB'
function francofy(str) {
    var result;
    switch(str){
        case 'Hello':
            result = 'Bon jour'; // 'Allo' might be better choice, but let's stick to node
            break;
        default:
            throw new Error('My Vocabulary is too limited');
    }
    return result;
};

// the most straightforward use of these functions

console.log('Synch message, synch translate', francofy(getMessage()));

// what if the translation is asynch - for example, you're calling off to an API 
// let's simulate the API delay with setTimeout
function contemplateTranslation(str,cb) {
    setTimeout(function(){
        var result = francofy(str);
        cb(result);
    },1000);
};

contemplateTranslation(getMessage(), function(translated){
    console.log('Synch Message, Asynch Translate: ' + translated);
});

// what if the message is async?
function getDelayedMessage(cb) {
    setTimeout(function(){
        cb('Hello');
    },1000);
};

getDelayedMessage(function(msg){
   console.log('Asynch Message, Synch Translate', francofy(msg));
});

// what if you need to call an asynchronous API to get your message and then
// call another asynchronous API to translate it?

getDelayedMessage(function(msg){
    contemplateTranslation(msg, function(translated){
        console.log("My God, it's full of callbacks", translated);
    });
});

另请注意,还有其他方法可以处理异步操作,例如使用promises(我更喜欢Q promise库,但还有其他选项)。但是,在覆盖抽象之前,可能值得理解核心行为。