プロミスによるWhileループ
2023-08-18 21:58:40
質問
プロミスでwhileループのようなことをする慣用的な方法は何でしょう。つまり
何かをする もし条件がまだ成立していれば、もう一度実行する 繰り返す を繰り返してください。
dosomething.then(possilblydomoresomethings).then(finish)
私はこの方法でやってきましたが、より良い、またはよりidomaticな方法があるのでしょうか?
var q = require('q');
var index = 1;
var useless = function(){
var currentIndex = index;
console.log(currentIndex)
var deferred = q.defer();
setTimeout(function(){
if(currentIndex > 10)
deferred.resolve(false);
else deferred.resolve(true);
},500);
return deferred.promise;
}
var control = function(cont){
var deferred = q.defer();
if(cont){
index = index + 1;
useless().then(control).then(function(){
deferred.resolve();
});
}
else deferred.resolve();
return deferred.promise;
}
var chain = useless().then(control).then(function(){console.log('done')});
出力します。 1 2 3 4 5 6 7 8 9 10 11 完了
どのように解決するのですか?
私なら、値をラップするためにオブジェクトを使用します。そうすることで
done
プロパティを使って、ループに完了を知らせることができます。
// fn should return an object like
// {
// done: false,
// value: foo
// }
function loop(promise, fn) {
return promise.then(fn).then(function (wrapper) {
return !wrapper.done ? loop(Q(wrapper.value), fn) : wrapper.value;
});
}
loop(Q.resolve(1), function (i) {
console.log(i);
return {
done: i > 10,
value: i++
};
}).done(function () {
console.log('done');
});
関連
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] bodyParser は非推奨です express 4
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] 既存のコールバックAPIをプロミスに変換するにはどうすればよいですか?
-
[解決済み] プロミスは単なるコールバックではないのか?
-
[解決済み】PromiseとObservablesの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み】Mongooseで配列の値を更新する方法
-
[解決済み】NPMインストールエラー:解析中の予期せぬJSON入力の終了 '...nt-webpack-plugin": "0'' 付近。
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] node.js - リクエスト - "emitter.setMaxListeners() "はどのように?
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。