理想情况下,您应该听一些事件而不是轮询,但要理解这是一个临时的解决方法......
new Promise()
同步运行它的构造函数,看起来它controller.storage.users.get()
也同步运行它的回调。通过强制异步getUser()
进行递归调用可以避免“超出最大调用堆栈大小”的可能性,最简单的方法是链接.new Promise().then(/* recurse from here */)
function getUser(userId) {
return new Promise((resolve, reject) => {
controller.storage.users.get(userId, function(err, user) {
if (err) reject(err);
if (!user) reject(new Error('no user for id: ' + useId)); // this branch needs to be catered for
resolve(user); // make `user` available to the .then() below
});
}).then(function(user) {
return (user.orderData && user.orderData.pendingItem) || getUser(userId); // compact and safe
});
}
这应该可以完成这项工作,但如果没有“最大调用堆栈大小”保护措施,很有可能会无缘无故地炸掉一两个处理器。
正如上面评论中所建议的,您可以并且可能应该在递归中添加一些延迟:
function delay(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
}
function getUser(userId) {
return new Promise((resolve, reject) => {
controller.storage.users.get(userId, function(err, user) {
if (err) reject(err);
if (!user) reject(new Error('no user for id: ' + useId)); // this branch needs to be catered for
resolve(user); // make `user` available to the .then() below
});
}).then(function(user) {
return (user.orderData && user.orderData.pendingItem) || delay(200).then(function() { // adjust the delay to maximum acceptable value
return getUser(userId);
});
});
}