[解決済み] Node.jsのコールバック関数から値を返す [重複] [重複
質問
私は、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さんが投稿した 良いリソース をコメントで紹介しています。について読む コールバック を読んでみてください。それは非同期コードであることを忘れないでください。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 非同期コールバック関数から値を返すには?重複
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?