• JS异步编程


    Promise

    const fs = require('fs');
    
    new Promise(function(resolve, reject){
        fs.readFile('a.txt', {encoding: 'utf8'}, function(err, newData){
            if(err) reject('fail');
            console.log('dataA is %d', newData);
    
            resolve(newData);
        });
    }).then(function(data){
        // 返回一个新的 promise 对象,使得下一个回调函数会等待该异步操作完成
        return new Promise(function(resolve, reject){
            fs.readFile('b.txt', {encoding: 'utf8'}, function(err, newData){
                if(err) reject('fail');
                console.log('dataB is %d', newData);
    
                resolve(parseInt(data)+parseInt(newData));
            });
        });
    }).then(function(data){
        return new Promise(function(resolve, reject){
            fs.readFile('c.txt', {encoding: 'utf8'}, function(err, newData){
                if(err) reject('fail');
                console.log('dataC is %d', newData);
    
                resolve(parseInt(data)+parseInt(newData));
            });
        });
    }).then(function(data){
        console.log('sum is %d', parseInt(data));
    }).catch(function(err){
        throw Error('fail');
    });
    
    // $ node index.js
    // dataA is 1
    // dataB is 2
    // dataC is 3
    // sum is 6

    Generator

    const fs = require('fs');
    
    const getData = function(fileName){
        return new Promise(function(resolve, reject){
            fs.readFile(fileName, {encoding: 'utf8'}, function(err, data){
                if(err) throw Error('fail');
                resolve(data);
            })
        });
    }
    
    const g = function* (){
        try{
            let dataA = yield getData('a.txt');  // yield 在暂停时刻并没有赋值,dataA 的值是在重新执行时刻由 next 方法的参数传入的
            console.log('dataA is %d', dataA);  
            let dataB = yield getData('b.txt');  
            console.log('dataB is %d', dataB); 
            let dataC = yield getData('c.txt');
            console.log('dataC is %d', dataC);
    
            console.log('sum is %d', parseInt(dataA) + parseInt(dataB) + parseInt(dataC));
        }catch(err){
            console.log(err);
        }
    };
    
    // 驱动 Generator 执行
    function run (generator) {
        let it = generator();
    
        function go(result) {
            // 判断是否遍历完成,标志位 result.done 为 true 表示遍历完成
            if (result.done) return result.value;
            // result.value 即为返回的 promise 对象
            return result.value.then(function (value) {
                return go(it.next(value));
            }, function (error) {
                return go(it.throw(error));
            });
        }
    
        go(it.next());
    }
    
    run(g);
    
    // $ node index.js
    // dataA is 1
    // dataB is 2
    // dataC is 3
    // sum is 6

    Async/Await

    const fs = require('fs');
    
    // 封装成 await 语句期望的 promise 对象
    const readFile = function(){
        let args = arguments;
        return new Promise(function(resolve, reject){
            fs.readFile(...args, function(err, data){
                // await 会吸收 resolve 传入的值作为返回值赋给变量
                resolve(data);
            })
        })
    };
    
    const asyncReadFile = async function(){
        let dataA = await readFile('a.txt', {encoding: 'utf8'});
        console.log('dataA is %d', dataA);
        let dataB = await readFile('b.txt', {encoding: 'utf8'});
        console.log('dataB is %d', dataB);
        let dataC = await readFile('c.txt', {encoding: 'utf8'});
        console.log('dataC is %d', dataC);
        console.log('sum is %d', parseInt(dataA) + parseInt(dataB) + parseInt(dataC));
    };
    
    asyncReadFile();
    console.log('异步执行');
    
    // $ node index.js
    // 异步执行
    // dataA is 1
    // dataB is 2
    // dataC is 3
    // sum is 6
  • 相关阅读:
    尘埃里的路人乙
    SlidingMenu 插件的使用 二
    观察者模式
    Android SlidingMenu插件的使用
    Android4.2 的Http 多线程 网络传输
    Sliverlight界面研究1
    Sliverlight界面研究2
    图片切换效果(定时+编号)
    管理模型 RACI模型
    Enable NLA in XP
  • 原文地址:https://www.cnblogs.com/wujiaqi/p/11340803.html
Copyright © 2020-2023  润新知