1. ホーム
  2. javascript

[解決済み] Node.jsのコールバック関数から値を返す [重複] [重複

2023-02-03 21:24:59

質問

私は、Node.jsのコールバック関数から値を返す際に小さな問題に直面しています。私はURLを取り、そのURLをヒットし、出力を与えるスニペットを持っていると考えています。

urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {                              
    var statusCode = response.statusCode;
    finalData = getResponseJson(statusCode, data.toString());
});

こんな感じで関数内にラップして値を返すようにしてみました。

function doCall(urlToCall) {
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {                              
    var statusCode = response.statusCode;
    finalData = getResponseJson(statusCode, data.toString());
    return finalData;
});
}

なぜなら、私のNode.jsのコードでは、たくさんの if-else ステートメントがあり urlToCall の値が決定されます。

if(//somecondition) {
   urlToCall = //Url1;
} else if(//someother condition) {
   urlToCall = //Url2;
} else {
   urlToCall = //Url3;
}

の中の全てのステートメントが urllib.request の値以外は同じままです。 urlToCall . だから、間違いなく私は関数の中にこれらの一般的なコードを置く必要があります。私は同じことを試みたが doCall は常に私を返します undefined . 私はこのように試してみました。

response = doCall(urlToCall);
console.log(response) //Prints undefined

しかし、もし doCall() の中で値を印刷すると、印刷は完璧ですが、常に undefined . 私の調査によると、コールバック関数から値を返すことはできないということを知りました。(それは本当ですか)?もしそうなら、この状況をどのように扱うべきか、どなたかアドバイスをお願いします。 if-else ブロックの中で重複したコードを防ぎたいのです。

どのように解決するのですか?

その undefined というのは console.log(response) が実行される前に doCall(urlToCall); が終了する前に実行されます。また、コールバック関数を渡す必要があります。 リクエスト が完了したときに実行されます。

まず、あなたの関数です。コールバックを渡します。

function doCall(urlToCall, callback) {
    urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {                              
        var statusCode = response.statusCode;
        finalData = getResponseJson(statusCode, data.toString());
        return callback(finalData);
    });
}

今すぐ

var urlToCall = "http://myUrlToCall";
doCall(urlToCall, function(response){
    // Here you have access to your variable
    console.log(response);
})

@Rodrigoさんが投稿した 良いリソース をコメントで紹介しています。について読む コールバック を読んでみてください。それは非同期コードであることを忘れないでください。