解决Promise While循环中的值

时间:2016-02-08 11:22:47

标签: javascript node.js promise bluebird

我发现:  Correct way to write loops for promise.While loop using bluebird promises

但是当我尝试使用这些来循环一个promise时,该promise的解析值不会传递给链。

例如,以下代码打印:

做了1次 做了2次 undefined < - 这应该是 hello world

var Promise = require('bluebird');

var times = 0;

var do_it = function(o) {
    return new Promise(function(resolve, reject) {
        setTimeout(function () {
            console.log("did it %d times", ++times);
            resolve(o);
        }, 1000);
    });
}

var promiseWhile = Promise.method(function(condition, action) {
    if (!condition()) return;
    return action().then(promiseWhile.bind(null, condition, action));
});

var do_it_twice = function(o) {
    return promiseWhile(
        function() { return times < 2; },
        function() { return do_it(o);  }
    );
}

do_it_twice("hello world").then(function(o) {console.log(o)});

2 个答案:

答案 0 :(得分:3)

您需要指定返回值

var promiseWhile = Promise.method(function(condition, action, result) {
    if (!condition()) return result;
    return action().then(promiseWhile.bind(null, condition, action, result));
});

var do_it_twice = function(o) {
    return promiseWhile(
        function() { return times < 2; },
        function() { return do_it(o);  },
        o
    );
}

答案 1 :(得分:0)

我最近遇到了类似这个问题的问题并遇到了这个问题。我最终使用异步递归函数来循环请求,直到满足条件。在我的情况下,我不得不检查响应的数组属性的长度(它是被抓取的数据,页面上的脚本有时在发送响应之前不会加载数据)。这是我的解决方案,如果响应不包含任何文章(它是vanilla ES6并允许您使用任何条件(我使用out.data.length === 0),它会发送另一个请求):

export async function scrape () {
    let out =  await axios.get('/api/scrape');
    if(out.data.articles.length===0){
        return await scrape();
    }
    else return out;
}