节点承诺循环等待结果
node promise for loop wait for result
如何等待for循环进入下一个循环?
我如何确保userdetails被执行和realresult。Playername在传递给新变量之前是否被赋值?
代码:return new Promise( function (resolve, reject) {
arr = [];
messages.find({convid: convid}).then(function(result) {
for(var a in result) {
realresult = result[a];
userData.userDetails(realresult.userid).then(function (result) {
realresult.playername = result.username;
});
userData.usercashinfo(realresult.userid).then(function (resulttwo) {
realresult.playerdetails = resulttwo;
});
arr.push(realresult);
}
return resolve(arr);
});
});
您正在尝试编写一个承诺,当它解析时,返回已解析的承诺值数组。这里有两件事你应该做:
- 使用
return
等待promise的完成。在承诺链中,没有任何东西实际解决承诺值,除非它是return
ed。(您也应该将此用于message.find()
,因为它也给您一个承诺。) - 将数组构造为承诺数组,而不是迭代并在承诺解析时将其推入数组。
- 使用
Promise.all()
收集承诺对象-all()
只有在所有传递给它的承诺都被解决后才返回。 - (可选)不要重复使用
result
变量名来表示多个事物。这里没有错,但是它会造成不必要的混乱。
放在一起,这看起来像:
return messages.find(...).then(function(result) {
var promiseArr = [];
for (var a in result) {
promiseArr.push(
promise.all([userData.userDetails(...), userData.usercashinfo(...)])
.then(function(detailinfo) {
var realresult = result[a];
var details = detailinfo[0];
var cashinfo = detailinfo[1];
realresult.playername = details.username;
realresult.playerdetails = cashinfo;
return realresult;
});
}
return Promise.all(promiseArr);
});
所以我认为这是一个好主意,尝试解决它与生成器和承诺的组合,我不确定这是最好的方式去,但这是一个很好的实践,两者的组合,所以我给了它一个尝试。
这个想法是,生成器函数在开始新的迭代之前等待回调函数,而回调函数在告诉生成器函数继续迭代之前等待两个承诺完成。
这里是一个更简单的例子,我第一次尝试在codepen
return new Promise( function (resolve, reject) {
arr = [];
messages.find({convid: convid}).then(function(result) {
function* iterations() {
for (var i = 0; i < result.length; i++) {
realresult = result[i];
try {
var cbResult = yield cb(result[i].userid);
realresult.playername = cbResult.playername;
realresult.playerdetails = cbResult.playerdetails;
arr.push(realresult);
} catch (e) { reject(e) }
}
return arr.value;
}
var it = iterations();
it.next();
function cb(userid) {
Promise.all([
userData.userDetails(userid),
userData.usercashinfo(userid)
]).then(
function(values) {
var realresult = {playername : values[0], playerdetails : values[1]}
returnValue = it.next(realresult);
if (returnValue.done) {
resolve(returnValue);
}
},
function(e) { reject(e) }
);
}
});
});
相关文章:
- 正在等待HTTP调用从函数返回结果
- 如何等待一个HTML页面并在页面复杂创建时获得结果
- 如何在js中等待if语句内部的结果
- JS GeoLocation:让$.ajax等待结果
- 等待ajax结果绑定淘汰模型
- 等待异步结果的 Chrome 系统调用
- 让 JavaScript 函数等待 Jquery 对话框模态的结果
- 我怎样才能异步执行 JavaScript 代码片段并等待它们的结果
- 我是否需要为每个具有等待结果回调的方法关闭
- 等待异步 Javascript 函数结束检索结果(延迟?)
- 在返回结果之前,我如何等待 jQuery.ajaxComplete in promise.done
- 如何在从 Meteor.method 返回之前等待子进程结果
- 使用'解决'以等待routeProvider中的查询结果
- jQuery递归获取等待结果
- 在所有类型的DOM等待机制中,将AMD javascript计算为库中的非AMD结果是未定义的
- 我怎么能等待谷歌远程呼叫返回我的结果之前继续
- 调用函数并等待结果
- 在执行之前等待链接点击弹出结果
- 等待回调函数的结果之前,另一个回调函数
- JavaScript异步回调-如何等待最终结果