Promise、async流程控制库

Posted by wantu on July 21, 2019

解决什么问题

  Promise是一种异步编程中流程控制的解决方案之一。它的诞生有利于我们写出更具可读性的代码,解决了回调地狱问题。Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了。

内容

基础知识

什么是callback?
  周知在同步编程中一个函数如果想要把函数体内部的处理结果进行返回,那么需要借助return关键字。但是在异步编程中主线程是暂时不会关注一个异步的执行结果的,它会继续的往下走。那么异步操作的结果怎么返回给主线程呢?就是通过callback。

  Promise的构造函数需要传入一个匿名函数,函数中有两个参数–resolve、reject(实际上这两货就是回调函数)。  Promise构造函数执行时立即调用里面的匿名函数。那么也就是这,程序开始做匿名函数中的工作了,一旦工作做完了(可能成功也可能失败),成功呢需要调用resolve函数将Promise的状态改为fulfilled,失败呢就调用reject函数将Promise的状态改为rejected。如果在这个匿名函数中抛出一个错误那么这个Promise的状态将改为rejected,它的返回值将会被忽略。

Promise的几种状态
  三种,分别是:刚刚构造时的准备(pending)、成功时的(fulfilled)、失败时的(rejected)。 状态一旦改变就不会再变动了,这也就是为什么称之为Promise(承诺)。状态的变动的方向是pendding->fulfilled,pendding->rejected。这两个方向。

async流程控制库
常用的方法就是那几个,其他的方法参见文档:
  async.auto(tasks, cb) 多个任务可能存在依赖关系,有的并行执行有的依次执行
  async.waterfall(tasks, cb) 多个任务依次执行,且前一个的输出结果作为下一个的输入
  async.series(tasks, cb) 多个任务依次执行,且任务之间没有数据交换
  async.parallel(tasks, cb) 多个函数并行执行

使用

例子1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const Promise = require('promise');

function sleep(time_ms){
    return new Promise( resolve => {
        setTimeout(resolve(time_ms), time_ms * 1000);
    });
}

async function test(n){
    console.info('start'+n);
    await sleep(n);
    console.info('end'+n);
}

async function main(){
    let timeMsArr = [1,2,3];
    try{
        for(let t of timeMsArr){
            await test(t);
        }
    }catch(err){
        console.info(`err`+err)
    }

    console.info('ok');
}

main();

思考与总结

理解Promise先整明白callback,而后认识到它的核心思想就是如果这个Promise的状态定下来了,接下来(then)该怎么去做。