- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在数据库
中有用户
列表:
让用户 = [];//请查看本文末尾的完整列表
这是我的 findUsers
函数:(这个函数看起来像从数据库中搜索。但我只是用硬编码数据编写了简单的函数)
function findUsers(user) {
return new Promise(function (resolve) {
resolve(user.users);
});
}
我想获取以 userId 开头的所有用户:
const walkUsers = (user, list) => {
let usrLst = user.users;
list = list || [];
usrLst.forEach((usr) => {
if (usr.users.length > 0) {
list = walkUsers(usr, list);
}
list.push(usr);
});
return list;
};
该函数返回正确的结果。
[
{ id: '009', name: 'User 9', users: [] },
{ id: '011', name: 'User 11', users: [] },
{ id: '010', name: 'User 10', users: [ [Object] ] },
{ id: '004', name: 'User 4', users: [ [Object], [Object] ] },
{ id: '003', name: 'User 3', users: [ [Object] ] },
{ id: '007', name: 'User 7', users: [] },
{ id: '002', name: 'User 2', users: [ [Object], [Object] ] },
{ id: '008', name: 'User 8', users: [] },
{ id: '005', name: 'User 5', users: [ [Object] ] },
{ id: '006', name: 'User 6', users: [] }
]
但这不是我的预期。我想从数据库(Mongoose)获取数据
const walkUsers = (user, list) => {
return findUsers(user)
.then((usrLst) => {
list = list || [];
usrLst.forEach((usr) => {
if (usr.users.length > 0) {
walkUsers(usr, list).then((rtnLst) => {
console.log("rtnLst");
console.log(rtnLst);
return rtnLst;
});
}
list.push(usr);
});
return list;
});
};
此函数缺少用户009
、010
、011
[
{ id: '002', name: 'User 2', users: [ [Object], [Object] ] },
{ id: '005', name: 'User 5', users: [ [Object] ] },
{ id: '006', name: 'User 6', users: [] },
{ id: '003', name: 'User 3', users: [ [Object] ] },
{ id: '007', name: 'User 7', users: [] },
{ id: '008', name: 'User 8', users: [] },
{ id: '004', name: 'User 4', users: [ [Object], [Object] ] }
]
我不知道我错了什么。能帮我查一下吗?
让我们检查用户
数据:
let users = [
{
id: '001',
name: 'User 1',
users: [
{
id: '002',
name: 'User 2',
users: [
{
id: '003',
name: 'User 3',
users: [
{
id: '004',
name: 'User 4',
users: [
{
id: '009',
name: 'User 9',
users: []
},
{
id: '010',
name: 'User 10',
users: [
{
id: '011',
name: 'User 11',
users: []
},
]
},
]
}
]
},
{
id: '007',
name: 'User 7',
users: []
}
]
},
{
id: '005',
name: 'User 5',
users: [
{
id: '008',
name: 'User 8',
users: []
}
]
},
{
id: '006',
name: 'User 6',
users: []
},
]
},
];
最佳答案
您需要进行以下更改:
usrLst.forEach()
循环中,累积您获得的 Promise 列表,然后使用 Promise.all()
以便您知道它们何时全部完成。目前,您根本无法跟踪对 walkUsers()
的调用何时完成,因此,根据时间的不同,您可能会丢失或错过一些结果。.then()
处理程序返回该主 Promise,以便将其链接到 walkUsers()
返回的父 findUsers()
Promise。 可能看起来像这样:
const walkUsers = (user, list) => {
return findUsers(user)
.then((usrLst) => {
list = list || [];
var promises = [];
usrLst.forEach((usr) => {
if (usr.users.length > 0) {
promises.push(walkUsers(usr, list));
}
list.push(usr);
});
return Promise.all(promises).then(function() {
// make the list be the resolved value from this promise
return list;
});
});
};
请记住,任何时候在 .then()
处理程序中进行异步操作时,几乎总是应该从 .then()
处理程序返回一个 Promise,以便内部异步操作链接到父操作,并且在所有嵌套异步操作完成之前,调用者不会被告知事情已完成。如果不是,该内部异步操作只会成为一个孤立的异步操作,它按自己的时间运行,上面没有任何东西等待它或与其协调,调用者是否看到其结果将取决于时间运气和代码如何工作的问题(这会产生不确定的结果)。
关于node.js - 递归 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41080017/
如何从 promise 中退出 promise ? perl6 文档没有提供简单的方法。例如: my $x = start { loop { # loop forever until "qui
我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。 我有一个加入用户的友谊加入模型。一列是 friender
请帮我解释一下为什么日志结果有两种不同: 方式 1:每 1 秒顺序记录一次 方式 2:1 秒后记录所有元素。 // Way 1 let sequence = Promise.resolve(); [1
我的问题很简单。 Promise.all() 方法可以返回 Promise 吗?让我解释一下: function simpleFunction() { let queue = [];
我正在使用 Promise 从存储中读取文件并转换为 base64 字符串。我有图像数组,使用 RNFS 读取图像 const promise_Images = _Images.map(async (
如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise: console.log(Promise.all([1])); // prints
Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值? 如果不使用 await,它在我的上下文中不起作用 没有包装的例子: function sum1(x){ r
我一直在玩 promise,通常能想出如何处理好它们,但在这种情况下,我不知道如何删除一个 promise-wrapping level。 代码如下: let promise2 = promise1.
考虑以下嵌套的Promises结构: const getData = async() => { const refs = [{ name: "John33", age: 3
我已经阅读了 Promise/A+ 规范,但据我了解,还有诸如 Promise/A 和 Promise 之类的东西。它们之间有什么区别? Promise 和 Promise/A 规范也是如此吗?如果是
当我运行以下代码时: my $timer = Promise.in(2); my $after = $timer.then({ say "2 seconds are over!"; 'result'
以下简单的 promise 是发誓的,我不允许打破它。 my $my_promise = start { loop {} # or sleep x; 'promise re
我正在尝试扩展Promise: class PersistedPromise extends Promise { } 然后在派生类上调用静态resolve以直接创建一个已解决的Promise: Per
我有两个返回 promise 的函数,我独立使用它们作为: getLocal().then(...) 和 getWeb().then(...) 但是现在我遇到了一个奇怪的问题: 1) 我需要第三个
我不知道 promise.all 解决方案中的 promise.all 是否是一个好的实践。我不确定。 我需要从一组用户获取信息,然后通过此信息响应,我需要发送消息通知。 let userList =
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为: ([ 30 seconds wait. 4 ]promiseValue )then:
大家好,提前感谢您的帮助。 下面是我正在尝试做的事情 function1(){ throw some error(); } function2() { // dosomething suc
我有以下未解析的代码。f2 解决了,所以我不会添加该代码,它是 f1 我有问题。 我调用函数,它到达最里面如果,它调用函数“find”,它执行函数 findId,完美返回 Id,然后执行 editId
我是一名优秀的程序员,十分优秀!