首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >While循环与承诺

While循环与承诺
EN

Stack Overflow用户
提问于 2013-06-20 23:28:29
回答 11查看 82.7K关注 0票数 78

什么是惯用的方式来做一些事情,如while循环与承诺。所以:

如果条件仍然成立,就做一些事情,再做一次,重复一次,然后再做其他事情。

代码语言:javascript
复制
dosomething.then(possilblydomoresomethings).then(finish)

我已经这样做了,我想知道有没有更好的/更简单的方法?

代码语言:javascript
复制
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完成

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-06-21 23:31:09

我会使用一个对象来包装这个值。这样,您就可以拥有一个done属性来让循环知道您已经完成了。

代码语言:javascript
复制
// 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');
});
票数 19
EN

Stack Overflow用户

发布于 2013-06-21 23:18:31

这是一个可重用的函数,我认为它非常清晰。

代码语言:javascript
复制
var Q = require("q");

// `condition` is a function that returns a boolean
// `body` is a function that returns a promise
// returns a promise for the completion of the loop
function promiseWhile(condition, body) {
    var done = Q.defer();

    function loop() {
        // When the result of calling `condition` is no longer true, we are
        // done.
        if (!condition()) return done.resolve();
        // Use `when`, in case `body` does not return a promise.
        // When it completes loop again otherwise, if it fails, reject the
        // done promise
        Q.when(body(), loop, done.reject);
    }

    // Start running the loop in the next tick so that this function is
    // completely async. It would be unexpected if `body` was called
    // synchronously the first time.
    Q.nextTick(loop);

    // The promise
    return done.promise;
}


// Usage
var index = 1;
promiseWhile(function () { return index <= 11; }, function () {
    console.log(index);
    index++;
    return Q.delay(500); // arbitrary async
}).then(function () {
    console.log("done");
}).done();
票数 60
EN

Stack Overflow用户

发布于 2014-06-18 01:55:37

这是蓝鸟的,不是Q,但是因为你没有特别提到Q..在bluebird api文档中,作者提到返回一个promise生成函数会比使用deferreds更惯用。

代码语言:javascript
复制
var Promise = require('bluebird');
var i = 0;

var counter = Promise.method(function(){
    return i++;
})

function getAll(max, results){
    var results = results || [];
    return counter().then(function(result){
        results.push(result);
        return (result < max) ? getAll(max, results) : results
    })
}

getAll(10).then(function(data){
    console.log(data);
})
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17217736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档