1. ホーム
  2. node.js

プロミスによる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');
});