2

こんにちは、stackoverflow コミュニティです。非同期を理解しようとしています。nodejs でのコーディングです。特に、呼び出しを行った後、メイン関数に結果を返そうとしています。

私はぐるぐる回って、これは次のいずれかを使用して実行できることがわかりました

  1. コールバック
  2. 約束(私が理解している約束はnodejsから削除されているため、NPMパッケージを使用してライブラリを追加する必要があります)

とにかく主な質問に戻ると、コールバック メソッドを実装するのに疲れましたが、何か間違ったことをしています。助けてください

以下のコードは、コールバック用に試したサンプルですが、外部の結果は決して実行されません。基本的には計算結果をrに返して欲しい。

function calc (n1, n2 , r){

    r = n1 + n2;
    console.log("inside result %s",r);
}


calc(1,2,function(r){
    console.log("outside result %s",r);});
4

4 に答える 4

2

コールバック効果を示す前の回答のバリエーション:

function calc (n1, n2 , result){
    var r = n1 + n2;
    console.log("The first result is %s, ",r);
    console.log("but for the final one we have to wait 2 seconds ...");
    setTimeout(function() { //waits 2 seconds
        r = r * r;
        console.log('Done!');
        result(r);
    }, 2000);
}

calc(1,2,function(num){
    console.log("The final result is %s",num);
});
console.log('... waiting, waiting ...'); //this shows up AFTER the first result but BEFORE the final one

ご挨拶。

于 2012-12-14T08:52:15.943 に答える
2

Promise はコア nodeJS ライブラリでは使用されません。Promise はコールバックと一緒に検討されましたが、コンセンサスがなかったため、理解しやすくオーバーヘッドが少ないコールバックが選択されました。(コールバックは、私が最初に学んだときは簡単ではありませんでした)

nodeJS では、一般的な方法として、コールバック関数errの最初のパラメーターとして を持ち、その後に値を返します。上記のcalc関数は次のようになります

function calc(a, b, callback) {
  if (tired)
    callback("Too tired to think.");   // error return
  else
    callback(null, a + b);             // success, note the null
}

それを呼び出すには

calc(1, 2, function(err, sum) {
  if (err)
     console.error(err);
  else
     console.log("Sum is " + sum);
});

に引数function(err, sum)として渡されることに注意してください。エラーが発生したかどうかを確認するには、単純に を実行します。それ以外の場合は成功です。callbackcalcif (err)

于 2013-01-12T23:46:40.523 に答える
0
r = n1 + n2;

これにより、パラメーターに新しい値が割り当てられrます。

関数を呼び出したい:

r(n1 + n2);
于 2012-12-11T22:33:46.127 に答える
0

私がここウードルズ テクノロジーズで働いて学んだことを共有させてください。例を挙げてみましょう。

functionCalldoSomeworkOnedoSomeworkTwodoSomeworkTwoの4 つの関数があり、いくつかの IO タスクを実行しているとします。

関数 doSomeworkThree functionCall は doSomeworkOne に依存し、doSomeworkOne は doSomeworkTwo に依存し、doSomeworkTwo は doSomeworkThree に依存します。これらを同期させるために、コールバック関数はすべての関数でパラメーターとして渡されます。

function functionCall(data, callback){
    ...........
    ...........
    doSomeworkOne(data, callback);
}


function doSomeworkOne(data, callback){
    ...........
    ...........
    doSomeworkTwo(otherData, callback);        
}


function doSomeworkTwo(otherData, callback){
    ...........
    ...........
    doSomeworkThree(otherData, callback);
}

<span style="font-size:16px;"><span style="font-family:arial,helvetica,sans-serif;"> function doSomeworkThree(otherData, callback){
    ...........
    ...........
    callback(result);
}
</span></span>

function callback(data){
    return data
}

一方、Callbackは良いです。コールバックの主な問題は、コールバック内にネストされていること、コールバック内にネストされていることです。ネストされたコールバックでは、コードのテスト/保守が非常に困難です。

ここで約束が来ます。Promise は、非同期コードを処理するためのよりクリーンで堅牢な方法を提供します。コールバックを使用する代わりに。また、promise でエラーを処理するのも非常に簡単です。

function functionCall(data){
    doSomeworkOne(data).then(function(data){
        return doSomeworkTwo(data);
    }).then(function(data){
        return     doSomeworkThree(data);
    }).catch(function(e) {
        // error handle    
    });
}


function doSomeworkOne(data){
    retrun new Promise(function(resolve, reject){
        ...........
        ...........
        if(error){
            reject(error);        
        }else{
            resolve(success);
        }
    })        
}


function doSomeworkTwo(data){
    retrun new Promise(function(resolve, reject){
        ...........
        ...........
        if(error){
            reject(error);        
        }else{
            resolve(success);
        }
    })        
}


function doSomeworkThree(data){
    retrun new Promise(function(resolve, reject){
        ...........
        ...........
        if(error){
            reject(error);        
        }else{
            resolve(success);
        }
    })        
}

注: Promise と Callback は基本的に違いはありません。Promise は、一連のアクションを実行するネストされたコールバックで推奨されます。これがお役に立てば幸いです。ありがとう。

于 2016-10-19T07:11:06.387 に答える