7

私は次のサンプルコードを持っています-最初の部分は非同期呼び出しになるかどうかはわかりません-どちらの方法でも続行する必要があります。条件がfalseの場合に実行する必要があるため、残りのコードを非同期コールバック内に配置できません。では、これを行う方法は?

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

 //do this next whether condition is true or not

関数の後に続くコードを配置することは、上記の非同期呼び出し内で、または条件がfalseの場合はelse呼び出しでその関数を呼び出す方法である可能性があると思いますが、中断する必要のない別の方法はありますか?関数でそれをアップしますか?

4

4 に答える 4

7

私がNodeで頻繁に使用しているライブラリは、Async(https://github.com/caolan/async)です。最後に、これがブラウザもサポートしていることを確認したので、ディストリビューションでこれをnpm / concat/minifyできるはずです。これをサーバー側でのみ使用している場合は、 https://github.com/continuationlabs/insyncを検討する必要があります。これは、ブラウザのサポートの一部が削除された、Asyncのわずかに改善されたバージョンです。

条件付き非同期呼び出しを使用するときに使用する一般的なパターンの1つは、順番に使用する関数を配列に入力し、それを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を使用することもできます。どちらの場合も、asyncまたは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 に答える