nodejs同步执行程序

node默认是异步执行的,

这也是他赖以生存的根本,

是效率高的本源。

但是,有的时候,我们希望代码是同步执行的,因为下面的执行任务用到前一步的结果。

别怕,有一些方式可以实现同步,

比如:promise,之前使用的是node4版本,先说node4版本的情况。

promise可以使用链式的方式,将功能的处理按照顺序执行。

那么如果遇到这样一个场景:

1.需要使用promise进行同步的链式操作;

2.有多条数据(不固定多少条),按照顺序一条一条存入数据库;

如何处理呢?

其实这种处理就是一个递归操作。

处理方式:

//保存一条数据到db

saveOne: function(dummy) {

    return new Promise(resolve, reject) {

        //保存dummy数据到db

        dummy = new models.Dummy(dummy);

        dummy.save(function(err) {

             if(err) { return resolve({status:1, message: err.stack });}

             else { return resolve({status:0, message: 'OK'}); }

        });

    }

},

//将数组中的数据,一条一条保存到数据库中

//通过调用saveOneByOneWithCallback来实现一个接一个的保存数据;

//传递的回掉函数,就是saveOneByOne的return,

//因此,实现了外部调用此方法,既是promise的方式,又实现了功能

saveOneByOne: function(dummies) {

    return new Promise(function(resolve, reject) {

        dummies = dummies || [];

        //var _ = require('lodash');

        dummies = _.isArray(dummies) ? dummies : [ dummies ];

        saveOneByOneWithCallback(dummies, undefined, function(result) {

              return resolve({status: 0, data: result});

        });

    });

},

//通过不断的循环调用,实现一个接一个的保存

//最后通过cb返回执行结果;

saveOneByOneWithCallback: function(dummies, result, cb) {

    dummies = dummies || [];

    result = result || [];

    if(dummies.length > 0) {

        var dummy = dummies[0];

        saveOne(dummy).then(function(saveResult) {

            result.push(saveReuslt);

            if(dummies.length > 1) {

                dummies = dummies.slice(1);

                saveOneByOneWithCallback(dummies,result,cb);

            }

        });

    }

}

PS: 其实这个还有一个方式,那就是将数据在保存到数据库之前进行从1开始的编号,

       如果是数据库有数据的情况,就要先查询数据库中的最大的数据,然后+1开始编号,

       使用编号的不好的方式,在于数据可能会有删除,

       不管使用物理删除还是软删除,编号要么重新排序,要么就会有断层。

       而使用这种方式的话,默认就根据id进行排序,id是包含了时间的有序的值。

       就比较方便了。

当然了,node4的版本太老了,现在的新项目基本都是使用node8+,

之前的老的项目,其实也需要使用新的版本进行重构了。

那么,在node8+的项目中,如何使用呢?

async/await就可以完美的解决这种问题,并且是非常优雅的解决。

示例如下:

const { once, EventEmitter } = require('events');

async function run() {

  const ee = new EventEmitter();

  process.nextTick(() => {

    ee.emit('myevent', 42);

  });

  const [value] = await once(ee, 'myevent');

  console.log(value);

  const err = new Error('kaboom');

  process.nextTick(() => {

    ee.emit('error', err);

  });

  try {

    await once(ee, 'myevent');

  } catch (err) {

    console.log('error happened', err);

  }

}

run();

示例来源:

https://nodejs.org/dist/latest-v12.x/docs/api/events.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。