【问题标题】:Promise.all array of promisesPromise.all 的承诺数组
【发布时间】:2017-05-17 00:57:48
【问题描述】:

我有这个代码:

 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。

ma​​p函数返回的数组里面都是promise。

最后一次通话:

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

返回一个承诺。

所以本质上,在拨打这个电话之后,我所拥有的是:

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

如何将数组值更改为 promise1.then( (result)) 的值?

【问题讨论】:

  • 不确定问题是什么? result 中的 promise 值应该与传递给 Promise.all()membersArray 的可迭代对象的顺序相同。你有什么问题?
  • @guest271314,我想知道后台进程。 Promise.all 如何处理所有的 Promise 并将实际的“返回”值映射到数组
  • “Promise.all 如何处理所有的 Promise 并将实际的“返回”值映射到数组中是什么意思?如果传递给Promise.all() 的可迭代元素是Promise,则传递已完成或已解决的Promise 的值,否则将元素转换为Promise。请注意,Promise 或转换为 Promise 的值不一定按顺序解析或拒绝,尽管返回的数组 result 将按照传递的可迭代的索引的顺序。
  • 数组的每个成员都传递了一个 Promise?不,您的箭头函数为每个成员调用一次,传递该成员并返回一个承诺。 Map 创建一个新的结果数组(在你的情况下是 promises,但它们可以是任何东西)。
  • @user7361276 .map() 不会将可迭代的值转换为 Promise 对象。你 return { email: member.email, victories: userVictories.length } 来自 .then(),它还返回一个新的 Promise 对象,其值设置为返回的普通对象。结果数组元素是来自Promise.all() 调用的Promise 值。是否有 .then() 链接到 db.group.findOne() 调用? result 是普通对象数组还是 Promise 对象? console.log(result) 记录了什么?

标签: javascript node.js mongodb asynchronous


【解决方案1】:

这些promise如何得出将数组值改为promise1.then((result))的值?

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

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);

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2019-01-05
    • 2017-06-10
    • 2020-04-24
    • 2022-08-20
    • 2020-02-29
    相关资源
    最近更新 更多