您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    用Promise讲一个悲伤的故事给你听(2)
    时间:2018-07-03 21:27 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    在下面的思绪中,我是一个一个找他们借钱的,一个借不着再找另一个。我为什么不同时找他们借呢?谁借我了,我就转钱给家里。此时我想起了刚学的 Promise.race 办法,也许这个办法可以协助我表达我的这一决策需求.

    function borrowMoneyFromOthers() { 

      // 同时向张三,李四,王五借钱,只需有人借我钱了,我就转钱给家里。 

      Promise.race([ 

        tryBorrowMoneyFromZhangshan(), 

        tryBorrowMoneyFromLisi(), 

        tryBorrowMoneyFromWangwu() 

      ]) 

        .then(transferMoneyToHome) 

        .catch(reasons => { 

          console.warn("没一团体情愿给我借钱,他们理由是:", reasons); 

        }); 

    我用timeout 模拟一下他们给我回答的,代码如下:

    // 尝试找张三借 

    function tryBorrowMoneyFromZhangshan(): Promise<number> { 

      return new Promise(function(fulfill, reject) { 

        setTimeout(() => { 

          fulfill(300); 

        }, 100); 

      }); 

    // 尝试找李四借 

    function tryBorrowMoneyFromLisi(): Promise<number> { 

      return new Promise(function(fulfill, reject) { 

        setTimeout(() => { 

          reject("对不起我也没钱"); 

        }, 50); 

      }); 

    // 尝试找王五借 

    function tryBorrowMoneyFromWangwu(): Promise<number> { 

      return new Promise(function(fulfill, reject) { 

        setTimeout(() => { 

          fulfill(300); 

        }, 500); 

      }); 

    结果运转之后,控制台输入的是:

    没一团体情愿给我借钱,他们理由是: 对不起我也没钱

    看来 Promise.race 适用用来模拟抢答,而不是选择最优解。 比如多人抢答一个成绩,第一个抢答之后不论他回答的能否是正确,这个题都过了。

    不过没关系。也许我可以本人写一个来叫做 promiseOne 的函数来完成这个功用。代码如下:

    /** 

     * 当其中一个 Promise 兑现时,前往的 Promise 即被兑现 

     * @param promises Promise<T> 的数组 

     */ 

    function promiseOne<T>(promises: Promise<T>[]): Promise<T> { 

      const promiseCount = promises.length; 

      return new Promise<T>(function(resolve, reject) { 

        const reasons: any[] = []; 

        let rejectedCount = 0; 

        promises.forEach((promise, index) => { 

          promise.then(resolve).catch(reason => { 

            reasons[index] = reason; 

            rejectedCount++; 

            if (rejectedCount === promiseCount) { 

              reject(reasons); 

            } 

          }); 

        }); 

      }); 

    (责任编辑:admin)