• 关于循环promise的解决方案


    es6的promise对象解决了js异步回调函数多重嵌套的的噩梦,再也不用写像这样的代码

    query('select * from user',function(err,data) {
        query('select * from user1',function(err,data) {
            query('select * from user2',function(err,data) {
                //无穷无尽的异步操作。。。
            })
        })
    })

    而可以像这样。

    query('select * from user')
    .then(function(data) {
        return query('select * from user1')
    })
    .then(function(data) {
        return query('select * from user2')
    })
    .then(function(data) {
        //后续操作。。。
    })

    代码的可读性得到了大大的提升,并且更容易维护。但是promise并不是万能的,比如说在循环中有多个异步操作,有无穷多个then函数就比较麻烦了,比如这样

    //查询订单及每个订单的每个商品
    query('select * from order')
    .then(data => {
        var orders = data
        for(let order of orders) {
            query('select * from order_prod where oid='+order.oid)
            .then(data => {
                order.prods = data
            })
        }
     //最终需要得到结果
       console.log(orders)
    })

    这里需要得到最终的结果就比较令人头疼了,好在es7的async/await异步方案为我们提供了解决方案。node.js7.6已经原生支持async/await,所以把node更新到7.6以上,就可以放心使用啦。async 可以声明一个异步函数,此函数需要返回一个 Promise 对象。await 可以等待一个 Promise 对象 resolve,并拿到结果。比如这样

    async function sleep(timeout) {  
      return new Promise((resolve, reject) => {
        setTimeout(function() {
          resolve();
        }, timeout);
      });
    }
    
    (async function() {
      console.log('Do some thing, ' + new Date());
      await sleep(3000);
      console.log('Do other things, ' + new Date());
    })();
    //Do some thing, Mon Feb 23 2015 21:52:11 GMT+0800 (CST)  
    //Do other things, Mon Feb 23 2015 21:52:14 GMT+0800 (CST)

    所以在循环promise取得最终结果就可以是这样 

    let getOrderProd = async data => {
        var order = data
        for(let order of orders) {
            //将之前封装的基于promised的query函数还原成普通的异步回调模式
            await f(order)
        }
        //最终需要得到结果
        console.log(orders)
        return new Promise((reslove,reject) => {
            reslove(orders)
        })
    }
    function f(i) {
     return new Promise((resolve,reject) => {
      query1('select * from order_prod where oid='+order.oid, function(err,data){
          i.prods = data
          resolve(i)
        })
     })
    }
    
    query('select * from order')
    .then(getOrderProd).then(data => {
        //后续操作。。。。。
    })

    这样循环异步操作的问题就解决了。

  • 相关阅读:
    《转》2013年那些深入人心的小故事
    sklearn学习2-----LogisticsRegression
    sklearn学习汇总
    sklearn学习1----sklearn.SVM.SVC
    树(5)-----判断两颗树一样或者一棵树是否是另外一颗的子树
    树(4)-----树的高度
    面试题1-----SVM和LR的异同
    算法19-----(位运算)找出数组中出现只出现一次的数
    树(3)-----栈(迭代)
    python中的全局变量、局部变量、实例变量
  • 原文地址:https://www.cnblogs.com/wandiao/p/6551546.html
Copyright © 2020-2023  润新知