繁体   English   中英

Promise.promise的所有数组

[英]Promise.all array of promises

我有以下代码:

 db.group.findOne({_id: id}).then((groupFound) => {
     var membersArray = groupFound.members;

     Promise.all(membersArray.map((member) => {
         return db 
            .doneTodo
            .find({'victor._id': member._id})
            .then((userVictories) => {
                return {
                    email: member.email,
                    victories: userVictories.length
                }
            });
    })).then(function (result) {
        console.log(result);
    });

数据库调用都是MongoDB / Mongoose。

map函数返回的数组内部是所有promise。

最后一个电话:

.then((userVictories) => {
    return {
        email: member.email,
        victories: userVictories.length
    }
})

返回承诺。

因此,从本质上讲,在进行此调用后,我得到的是:

[promise1, promise2, promise3, ... , promise x]

这些诺言如何得出结论以将数组值更改为promise1.then( (result))

如何完成这些承诺以将数组值更改为promise1.then((result))的值?

这里没什么特别的。 数组中的promise会像任何promise一样起作用-它们将在一段时间后解析为某个值,在一段时间后导致错误,或者如果它们的设置不正确,则永远不要解析或产生错误。

Promise.all的目的仅仅是等待数组中的所有值解析或抛出一个错误。 如果它们全部解决,则Promise.all返回的Promise.all将解析为所有结果的数组。 如果有人抛出错误,它将产生该错误。

Promise.all对承诺没有做任何事情 ,只是在遵守它们。 我们可以创建自己的Promise.all版本,就像这样:

 function myAll(arr) { var resolvedCount = 0; var resultArray = []; return new Promise(function (resolve, reject) { if (arr.length === 0) { resolve([]); } arr.forEach(function (el, i) { // wrap el in a promise in case it's not already one Promise.resolve(el) .then( function (result) { // add result to the result array and increment the count resultArray[i] = result; resolvedCount += 1; if (resolvedCount === arr.length) { // all promises have resolved, // so this promise can resolve itself resolve(resultArray); } }, function (err) { // a promise threw an error. reject reject(err); } ); // end of .then() }); // end of .forEach() }); // end of new Promise() } // test out myAll() function log(value) { console.log(value); } function logError(value) { log('Error caught:' + value); } myAll([]) .then(log, logError); myAll([1, Promise.resolve('apple'), 5, Promise.resolve(7)]) .then(log, logError); myAll([2, 3, Promise.reject('no!')]) .then(log, logError); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM