7

我有以下示例代码 - 第一部分可能导致异步调用 - 无论哪种方式都应该继续。我不能将其余代码放在异步回调中,因为它需要在条件为假时运行。那么如何做到这一点呢?

if(condition) {
    someAsyncRequest(function(error, result)) {
        //do something then continue
    }
}

 //do this next whether condition is true or not

我假设将代码放在函数中可能是在上面的异步调用中调用该函数的方法,或者如果条件为假,则在 else 调用中调用该函数 - 但是否有另一种不需要我打破的方法它在功能上?

4

4 回答 4

7

我在 Node 中经常使用的一个库是 Async ( https://github.com/caolan/async )。最后我检查了这也支持浏览器,所以你应该能够在你的发行版中 npm / concat / minify 这个。如果你只在服务器端使用它,你应该考虑https://github.com/continuationlabs/insync,它是 Async 的略微改进版本,删除了一些浏览器支持。

我在使用条件异步调用时使用的一种常见模式是使用我想要按顺序使用的函数填充数组并将其传递给 async.waterfall。

我在下面提供了一个示例。

var tasks = [];

if (conditionOne) {
    tasks.push(functionOne);
}

if (conditionTwo) {
    tasks.push(functionTwo);
}

if (conditionThree) {
   tasks.push(functionThree);
}

async.waterfall(tasks, function (err, result) {
    // do something with the result.
    // if any functions in the task throws an error, this function is 
    // immediately called with err == <that error>
});

var functionOne = function(callback) {
    // do something
    // callback(null, some_result);
};

var functionTwo = function(previousResult, callback) {
    // do something with previous result if needed
    // callback(null, previousResult, some_result);
};

var functionThree = function(previousResult, callback) {
    // do something with previous result if needed
    // callback(null, some_result);
};

当然,您可以使用 Promise 代替。无论哪种情况,我都喜欢通过使用异步或承诺来避免嵌套回调。

不使用嵌套回调可以避免的一些事情是变量冲突、提升错误、向右“行进”> > > >、难以阅读的代码等。

于 2015-10-20T12:47:09.700 回答
3

只需声明在需要时运行的其他函数:

var otherFunc = function() {
   //do this next whether condition is true or not
}

if(condition) {
    someAsyncRequest(function(error, result)) {
        //do something then continue

        otherFunc();
    }
} else {
    otherFunc();
}
于 2012-10-27T03:08:58.330 回答
3

只是另一种方法,这就是我抽象模式的方式。可能有一些库(承诺?)处理同样的事情。

function conditional(condition, conditional_fun, callback) {
    if(condition)
        return conditional_fun(callback);
    return callback();
}

然后在你可以写的代码

conditional(something === undefined,
            function(callback) {
               fetch_that_something_async(function() {
                  callback();
               });
            },
            function() {

                       /// ... This is where your code would continue


             });
于 2015-02-04T12:24:15.217 回答
0

我会推荐使用clojurescript,它有一个很棒的核心异步库,它在处理异步调用时让生活变得超级简单。

在你的情况下,你会写这样的东西:

(go
  (when condition
    (<! (someAsyncRequest)))
  (otherCodeToHappenWhetherConditionIsTrueOrNot))

请注意go将导致主体异步运行的宏,以及<!将阻塞直到异步函数返回的函数。由于<!函数在when条件内,只有在条件为真时才会阻塞。

于 2015-08-27T13:38:07.580 回答