promise.all 怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了promise.all 怎么用相关的知识,希望对你有一定的参考价值。

Promise.all 是在所有的Promise对象都执行完成之后resolve。参数是一个数组,数组的每一项都是一个Promise对象就可以。


Promise.all( [

    promise1,

    promise2

] ).then( function()

    // do something

);


Proimse.all( [ Promise.resolve(), Promise.resolve() ] ).then( function()

    // do something

);


比如你有两个异步的执行:


Promise.all( [

    new Promise( function( resolve )

        setTimeout( function()

            resolve();

        , 2000 );

     ),

    

    new Promise( function( resolve )

        setTimeout( function()

            resolve();

        , 2000 );

     )

] );

参考技术A

romise.all 是在所有的Promise对象都执行完成之后resolve。参数是一个数组,数组的每一项都是一个Promise对象就可以。

    promise

    读音

    英 ['prɒmɪs]  美 ['prɑmɪs] 

    释义

    n. 许诺,允诺;希望

    vt. 允诺,许诺;给人以…的指望或希望

    vi. 许诺;有指望,有前途

    短语

    Promise Technology 乔鼎资讯 ; 乔鼎信息 ; 乔鼎科技 ; 乔鼎咨询

    promise n 答应 ; 允诺 ; 前途 ; 承诺

    promise yourself 承诺自己

    句子

    She broke her promise to me. 

    她没有承担对我的许诺。 

    The future holds limitless promise. 

    未来有着无限的希望。 

    You can't swallow the promise of financial allocation that you made yesterday. 

    你不能取消你昨天作出的财政拨款的允诺。

Promise.all() 允许失败的替代方案? [复制]

【中文标题】Promise.all() 允许失败的替代方案? [复制]【英文标题】:Promise.all() Alternative that allows failure? [duplicate] 【发布时间】:2017-09-16 03:55:55 【问题描述】:

据我了解,Promise.all() 并行执行所有内容,并在任一 Promise 中的第一个错误实例返回错误。

现在,如果我想并行运行所有 Promise 并等待它们完成,即使其中一个失败了怎么办?

是否有我应该使用的 Promise 方法或模块?

我正在并行发送一堆用户 FCM 推送通知,并且如果其中任何一个失败,则 .then() 排队失败。

我在我的代码中这样做

//then chain

    .then(()=>
            let startChatPromises = [];
            for (let i = 0 ; i < queue_length ; i ++)
                startChatPromises.push(matchUsers(some_key,some_key));
            
            return Promise.all(startChatPromises);
        ).then(()=>// Continue processing even after failure ?);


let matchUsers = (room_id,...user_ids) => 

    let chat_key = admin.database().ref().child("chats").child(room_id).push().key;

    let participants = ;

    user_ids.forEach(user_id=> 
        participants[`$user_id`] = true;
    );

    return admin.database().ref().child("chats").child(room_id).child(chat_key).update(
        "last_message_ts" : new Date().getTime(),
        "participants" : participants
    ).then(()=>
        //Get Users
        let getFCMTokenPromises = [];
        user_ids.forEach(user_id => 
            getFCMTokenPromises.push(admin.database().ref("users").child(user_id).child("fcm_id").once('value'));
        );
        return Promise.all(getFCMTokenPromises);
    ).then(results => 
        // Send Push Notifications
        let tokens = [];
        results.forEach(snapshot=>
            if (snapshot.val() !== undefined && snapshot.val() !== null && snapshot.val() !== "")
                tokens.push(snapshot.val());
        );
        const payload = 
            data: 
                NOTIFICATION_TYPE: 'START_CHAT',
                CHAT_UID: chat_key
            
        ;
        return admin.messaging().sendToDevice(tokens, payload);
    ).catch(()=>
        return true;
    )
;

【问题讨论】:

【参考方案1】:

你可以这样做:

function allSkippingErrors(promises) 
  return Promise.all(
    promises.map(p => p.catch(error => null))
  )

这会将所有有错误的Promise 对象解析为结果数组中的null。您还可以使用.catch(error =&gt; error) 保留Error 对象,以便在最后检测故障,或解析为具有 status, result, error 属性的对象。

【讨论】:

谢谢,这看起来很棒! 使用Promise.all( ) 是不是最佳的好习惯,性能呢 这与使用Promise.all 完全没有包装器一样高效。您的承诺可能是异步的,因此 CPU 能力应该不是问题。内存方面,除非你有一个包含 100.000 个 promise 的数组,否则不要担心。 如果您没有在顶部看到关于 Promise.allSettled 的其他堆栈溢出的通知,请查看。 随意看看 Promise.allSettled() > Promise.allSettled() 方法返回一个在所有给定的承诺都已履行或拒绝后解决的承诺,并带有一组对象每个都描述了每个承诺的结果。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

以上是关于promise.all 怎么用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Promise.all() 在 Promise 实现时执行操作

用Promise.all加载图像

Promise.all() 允许失败的替代方案? [复制]

es6 promise.all()

promiseall退出条件

Promise.all使用场景