我发现: 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)});
答案 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;
}