Nodejs-使用 promise 替代回调函数

OpenClaw + Qwen 模型集成飞书完整教程 1、环境要求:- **操作系统**: Windows- **Node.js**: v18+ (推荐 v20+)- **飞书账号**: 需要企业管理员权限(创建应用用)或者个人飞书账号创建个人应用- **网络**: 能访问 GitHub 和飞书开放平台2、安装Node.js下载完成后验证是否安装成功,cmd窗口输入“node --version”,显示版本号即为安装成功(如下图所示)3、获取大模型APIKEY(这里以Qwen为例) 阅读详情

原文链接:http://wiki.jikexueyuan.com/project/node-lessons/promise.html

知识点

  1. 理解 Promise 概念,为什么需要 promise
  2. 学习 q 的 API,利用 q 来替代回调函数(https://github.com/kriskowal/q)

课程内容

第五课(https://github.com/alsotang/node-lessons/tree/master/lesson5)讲述了如何使用 async 来控制并发。async 的本质是一个流程控制。其实在异步编程中,还有一个更为经典的模型,叫做 Promise/Deferred 模型。

本节我们就来学习这个模型的代表实现:q

首先,我们思考一个典型的异步编程模型,考虑这样一个题目:读取一个文件,在控制台输出这个文件内容。

var fs = require('fs');
fs.readFile('sample.txt', 'utf8', function (err, data) {
    console.log(data);
});

看起来很简单,再进一步: 读取两个文件,在控制台输出这两个文件内容。

var fs = require('fs');
fs.readFile('sample01.txt', 'utf8', function (err, data) {
    console.log(data);
    fs.readFile('sample02.txt', 'utf8', function (err,data) {
        console.log(data);
    });
});
要是读取更多的文件呢?
var fs = require('fs');
fs.readFile('sample01.txt', 'utf8', function (err, data) {
    fs.readFile('sample02.txt', 'utf8', function (err,data) {
        fs.readFile('sample03.txt', 'utf8', function (err, data) {
            fs.readFile('sample04.txt', 'utf8', function (err, data) {

            });
        });
    });
});
这段代码就是臭名昭著的邪恶金字塔(Pyramid of Doom)。可以用async来改善这段代码,但是在本课中我们用promise/defer来改善它。

promise基本概念

先学习promise的基本概念。

  • promise只有三种状态,未完成,完成(fulfilled)和失败(rejected)。
  • promise的状态可以由未完成转换成完成,或者未完成转换成失败。
  • promise的状态转换只发生一次

promise有一个then方法,then方法可以接受3个函数作为参数。前两个函数对应promise的两种状态fulfilled, rejected的回调函数。第三个函数用于处理进度信息。

promiseSomething().then(function(fulfilled){
        //当promise状态变成fulfilled时,调用此函数
    },function(rejected){
        //当promise状态变成rejected时,调用此函数
    },function(progress){
        //当返回进度信息时,调用此函数
    });
学习一个简单的例子:

var Q = require('q');
var defer = Q.defer();
/**
 * 获取初始promise
 * @private
 */
function getInitialPromise() {
  return defer.promise;
}
/**
 * 为promise设置三种状态的回调函数
 */
getInitialPromise().then(function(success){
    console.log(success);
},function(error){
    console.log(error);
},function(progress){
    console.log(progress);
});
defer.notify('in progress');//控制台打印in progress
defer.resolve('resolve');   //控制台打印resolve
defer.reject('reject');     //没有输出。promise的状态只能改变一次

promise的传递

then方法会返回一个promise,在下面这个例子中,我们用outputPromise指向then返回的promise。

var outputPromise = getInputPromise().then(function (fulfilled) {
    }, function (rejected) {
    });

现在outputPromise就变成了受 function(fulfilled) 或者 function(rejected)控制状态的promise了。怎么理解这句话呢?

  • 当function(fulfilled)或者function(rejected)返回一个值,比如一个字符串,数组,对象等等,那么outputPromise的状态就会变成fulfilled。

在下面这个例子中,我们可以看到,当我们把inputPromise的状态通过defer.resovle()变成fulfilled时,控制台输出fulfilled.

当我们把inputPromise的状态通过defer.reject()变成rejected,控制台输出rejected

var Q = require('q');
var defer = Q.defer();
/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,调用function(fulfilled)
 * 当inputPromise状态由未完成变成rejected时,调用function(rejected)
 * 将then返回的promise赋给outputPromise
 * function(fulfilled) 和 function(rejected) 通过返回字符串将outputPromise的状态由
 * 未完成改变为fulfilled
 * @private
 */
var outputPromise = getInputPromise().then(function(fulfilled){
    return 'fulfilled';
},function(rejected){
    return 'rejected';
});

/**
 * 当outputPromise状态由未完成变成fulfil时,调用function(fulfilled),控制台打印'fulfilled: fulfilled'。
 * 当outputPromise状态由未完成变成rejected, 调用function(rejected), 控制台打印'fulfilled: rejected'。
 */
outputPromise.then(function(fulfilled){
    console.log('fulfilled: ' + fulfilled);
},function(rejected){
    console.log('rejected: ' + rejected);
});

/**
 * 将inputPromise的状态由未完成变成rejected
 */
defer.reject(); //输出 fulfilled: rejected

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
//defer.resolve(); //输出 fulfilled: fulfilled

  • 当function(fulfilled)或者function(rejected)抛出异常时,那么outputPromise的状态就会变成rejected
var Q = require('q');
var fs = require('fs');
var defer = Q.defer();

/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,调用function(fulfilled)
 * 当inputPromise状态由未完成变成rejected时,调用function(rejected)
 * 将then返回的promise赋给outputPromise
 * function(fulfilled) 和 function(rejected) 通过抛出异常将outputPromise的状态由
 * 未完成改变为reject
 * @private
 */
var outputPromise = getInputPromise().then(function(fulfilled){
    throw new Error('fulfilled');
},function(rejected){
    throw new Error('rejected');
});

/**
 * 当outputPromise状态由未完成变成fulfil时,调用function(fulfilled)。
 * 当outputPromise状态由未完成变成rejected, 调用function(rejected)。
 */
outputPromise.then(function(fulfilled){
    console.log('fulfilled: ' + fulfilled);
},function(rejected){
    console.log('rejected: ' + rejected);
});

/**
 * 将inputPromise的状态由未完成变成rejected
 */
defer.reject();     //控制台打印 rejected [Error:rejected]

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
//defer.resolve(); //控制台打印 rejected [Error:fulfilled]
  • 当function(fulfilled)或者function(rejected)返回一个promise时,outputPromise就会成为这个新的promise.

这样做有什么意义呢? 主要在于聚合结果(Q.all),管理延时,异常恢复等等

比如说我们想要读取一个文件的内容,然后把这些内容打印出来。可能会写出这样的代码:

//错误的写法
var outputPromise = getInputPromise().then(function(fulfilled){
    fs.readFile('test.txt','utf8',function(err,data){
        return data;
    });
});

然而这样写是错误的,因为function(fulfilled)并没有返回任何值。需要下面的方式:

var Q = require('q');
var fs = require('fs');
var defer = Q.defer();

/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,调用function(fulfilled)
 * 当inputPromise状态由未完成变成rejected时,调用function(rejected)
 * 将then返回的promise赋给outputPromise
 * function(fulfilled)将新的promise赋给outputPromise
 * 未完成改变为reject
 * @private
 */
var outputPromise = getInputPromise().then(function(fulfilled){
    var myDefer = Q.defer();
    fs.readFile('test.txt','utf8',function(err,data){
        if(!err && data) {
            myDefer.resolve(data);
        }
    });
    return myDefer.promise;
},function(rejected){
    throw new Error('rejected');
});

/**
 * 当outputPromise状态由未完成变成fulfil时,调用function(fulfilled),控制台打印test.txt文件内容。
 *
 */
outputPromise.then(function(fulfilled){
    console.log(fulfilled);
},function(rejected){
    console.log(rejected);
});

/**
 * 将inputPromise的状态由未完成变成rejected
 */
//defer.reject();

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
defer.resolve(); //控制台打印出 test.txt 的内容


方法传递

方法传递有些类似于Java中的try和catch。当一个异常没有响应的捕获时,这个异常会接着往下传递。

方法传递的含义是当一个状态没有响应的回调函数,就会沿着then往下找。

  • 没有提供function(rejected)

var outputPromise = getInputPromise().then(function(fulfilled){})

如果inputPromise的状态由未完成变成rejected, 此时对rejected的处理会由outputPromise来完成。
var Q = require('q');
var fs = require('fs');
var defer = Q.defer();
/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,调用function(fulfilled)
 * 当inputPromise状态由未完成变成rejected时,这个rejected会传向outputPromise
 */
var outputPromise = getInputPromise().then(function(fulfilled){
    return 'fulfilled'
});
outputPromise.then(function(fulfilled){
    console.log('fulfilled: ' + fulfilled);
},function(rejected){
    console.log('rejected: ' + rejected);
});

/**
 * 将inputPromise的状态由未完成变成rejected
 */
defer.reject('inputpromise rejected'); //控制台打印rejected: inputpromise rejected

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
//defer.resolve();

  • 没有提供function(fulfilled)
var outputPromise = getInputPromise().then(null,function(rejected){})
如果inputPromise的状态由未完成变成fulfilled, 此时对fulfil的处理会由outputPromise来完成。
var Q = require('q');
var fs = require('fs');
var defer = Q.defer();

/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,传递给outputPromise
 * 当inputPromise状态由未完成变成rejected时,调用function(rejected)
 * function(fulfilled)将新的promise赋给outputPromise
 * 未完成改变为reject
 * @private
 */
var outputPromise = getInputPromise().then(null,function(rejected){
    return 'rejected';
});

outputPromise.then(function(fulfilled){
    console.log('fulfilled: ' + fulfilled);
},function(rejected){
    console.log('rejected: ' + rejected);
});

/**
 * 将inputPromise的状态由未完成变成rejected
 */
//defer.reject('inputpromise rejected');

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
defer.resolve('inputpromise fulfilled'); //控制台打印fulfilled: inputpromise fulfilled

  • 可以使用fail(function(error))来专门针对错误处理,而不是使用then(null,function(error))
var outputPromise = getInputPromise().fail(function(error){})
看这个例子
var Q = require('q');
var fs = require('fs');
var defer = Q.defer();

/**
 * 通过defer获得promise
 * @private
 */
function getInputPromise() {
    return defer.promise;
}

/**
 * 当inputPromise状态由未完成变成fulfil时,调用then(function(fulfilled))
 * 当inputPromise状态由未完成变成rejected时,调用fail(function(error))
 * function(fulfilled)将新的promise赋给outputPromise
 * 未完成改变为reject
 * @private
 */
var outputPromise = getInputPromise().then(function(fulfilled){
    return fulfilled;
}).fail(function(error){
    console.log('fail: ' + error);
});
/**
 * 将inputPromise的状态由未完成变成rejected
 */
defer.reject('inputpromise rejected');//控制台打印fail: inputpromise rejected

/**
 * 将inputPromise的状态由未完成变成fulfilled
 */
//defer.resolve('inputpromise fulfilled');

  • 可以使用progress(function(progress))来专门针对进度信息进行处理,而不是使用 then(function(success){},function(error){},function(progress){})
var Q = require('q');
var defer = Q.defer();
/**
 * 获取初始promise
 * @private
 */
function getInitialPromise() {
  return defer.promise;
}
/**
 * 为promise设置progress信息处理函数
 */
var outputPromise = getInitialPromise().then(function(success){

}).progress(function(progress){
    console.log(progress);
});

defer.notify(1);
defer.notify(2); //控制台打印1,2

promise链

promise链提供了一种让函数顺序执行的方法。

函数顺序执行是很重要的一个功能。比如知道用户名,需要根据用户名从数据库中找到相应的用户,然后将用户信息传给下一个函数进行处理。

var Q = require('q');
var defer = Q.defer();

//一个模拟数据库
var users = [{'name':'andrew','passwd':'password'}];

function getUsername() {
return defer.promise;
}

function getUser(username){
    var user;
    users.forEach(function(element){
        if(element.name === username) {
            user = element;
        }
    });
    return user;
}

//promise链
getUsername().then(function(username){
 return getUser(username);
}).then(function(user){
 console.log(user);
});

defer.resolve('andrew');

我们通过两个then达到让函数顺序执行的目的。

then的数量其实是没有限制的。当然,then的数量过多,要手动把他们链接起来是很麻烦的。比如

foo(initialVal).then(bar).then(baz).then(qux)
这时我们需要用代码来动态制造promise链
var funcs = [foo,bar,baz,qux]
var result = Q(initialVal)
funcs.forEach(function(func){
    result = result.then(func)
})
return result
当然,我们可以再简洁一点
var funcs = [foo,bar,baz,qux]
funcs.reduce(function(pre,current),Q(initialVal){
    return pre.then(current)
})
看一个具体的例子
function foo(result) {
    console.log(result);
    return result+result;
}
//手动链接
Q('hello').then(foo).then(foo).then(foo);                                   //控制台输出: hello
                                                                            //             hellohello
                                                                            //             hellohellohello

//动态链接
var funcs = [foo,foo,foo];
var result = Q('hello');
funcs.forEach(function(func){
    result = result.then(func);
});
//精简后的动态链接
funcs.reduce(function(prev,current){
    return prev.then(current);
},Q('hello'));
对于promise链,最重要的是需要理解为什么这个链能够顺序执行。如果能够理解这点,那么以后自己写promise链可以说是轻车熟路啊。

promise组合

回到我们一开始读取文件内容的例子。如果现在让我们把它改写成promise链,是不是很简单呢?

var Q = require('q'),
    fs = require('fs');
function printFileContent(fileName) {
    return function(){
        var defer = Q.defer();
        fs.readFile(fileName,'utf8',function(err,data){
          if(!err && data) {
            console.log(data);
            defer.resolve();
          }
        })
        return defer.promise;
    }
}
//手动链接
printFileContent('sample01.txt')()
    .then(printFileContent('sample02.txt'))
    .then(printFileContent('sample03.txt'))
    .then(printFileContent('sample04.txt'));   //控制台顺序打印sample01到sample04的内容

很有成就感是不是。然而如果仔细分析,我们会发现为什么要他们顺序执行呢,如果他们能够并行执行不是更好吗? 我们只需要在他们都执行完成之后,得到他们的执行结果就可以了。

我们可以通过Q.all([promise1,promise2...])将多个promise组合成一个promise返回。 注意:

  1. 当all里面所有的promise都fulfil时,Q.all返回的promise状态变成fulfil
  2. 当任意一个promise被reject时,Q.all返回的promise状态立即变成reject

我们来把上面读取文件内容的例子改成并行执行吧

var Q = require('q');
var fs = require('fs');
/**
 *读取文件内容
 *@private
 */
function printFileContent(fileName) {
        //Todo: 这段代码不够简洁。可以使用Q.denodeify来简化
        var defer = Q.defer();
        fs.readFile(fileName,'utf8',function(err,data){
          if(!err && data) {
            console.log(data);
            defer.resolve(fileName + ' success ');
          }else {
            defer.reject(fileName + ' fail ');
          }
        })
        return defer.promise;
}

Q.all([printFileContent('sample01.txt'),printFileContent('sample02.txt'),printFileContent('sample03.txt'),printFileContent('sample04.txt')])
    .then(function(success){
        console.log(success);
    }); //控制台打印各个文件内容 顺序不一定

现在知道Q.all会在任意一个promise进入reject状态后立即进入reject状态。如果我们需要等到所有的promise都发生状态后(有的fulfil, 有的reject),再转换Q.all的状态, 这时我们可以使用Q.allSettled
var Q = require('q'),
    fs = require('fs');
/**
 *读取文件内容
 *@private
 */
function printFileContent(fileName) {
    //Todo: 这段代码不够简洁。可以使用Q.denodeify来简化
    var defer = Q.defer();
    fs.readFile(fileName,'utf8',function(err,data){
      if(!err && data) {
        console.log(data);
        defer.resolve(fileName + ' success ');
      }else {
        defer.reject(fileName + ' fail ');
      }
    })
    return defer.promise;
}

Q.allSettled([printFileContent('nosuchfile.txt'),printFileContent('sample02.txt'),printFileContent('sample03.txt'),printFileContent('sample04.txt')])
    .then(function(results){
        results.forEach(
            function(result) {
                console.log(result.state);
            }
        );
    });

结束promise链

通常,对于一个promise链,有两种结束的方式。第一种方式是返回最后一个promise

如 return foo().then(bar);

第二种方式就是通过done来结束promise链

如 foo().then(bar).done()

为什么需要通过done来结束一个promise链呢? 如果在我们的链中有错误没有被处理,那么在一个正确结束的promise链中,这个没被处理的错误会通过异常抛出。

var Q = require('q');
/**
 *@private
 */
function getPromise(msg,timeout,opt) {
    var defer = Q.defer();
    setTimeout(function(){
    console.log(msg);
        if(opt)
            defer.reject(msg);
        else
            defer.resolve(msg);
    },timeout);
    return defer.promise;
}
/**
 *没有用done()结束的promise链
 *由于getPromse('2',2000,'opt')返回rejected, getPromise('3',1000)就没有执行
 *然后这个异常并没有任何提醒,是一个潜在的bug
 */
getPromise('1',3000)
    .then(function(){return getPromise('2',2000,'opt')})
    .then(function(){return getPromise('3',1000)});
/**
 *用done()结束的promise链
 *有异常抛出
 */
getPromise('1',3000)
    .then(function(){return getPromise('2',2000,'opt')})
    .then(function(){return getPromise('3',1000)})
    .done();

结束语

当你理解完上面所有的知识点时,你就会正确高效的使用promise了。本节只是讲了promise的原理和几个基本的API,不过你掌握了这些之后,再去看q的文档,应该很容易就能理解各个api的意图。



1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务 本文基于 SAP Cloud Application Programming 编程模型的 OData 服务开发教程的第一步,简述了 SAP Business Technology Platform 里 Business Application Studio 开发工具的打开方式,创建 Dev Space 以及 CAP 项目的创建步骤,以及如何通过 schema.cds 和 service.cds 分别创建 OData 模型和 OData 服务,最后通过 ports preview 打开 OData 服务预览页 阅读详情

相关推荐

激光雷达-IMU标定工具lidar_imu_calib保姆级教程(VLP-16实测)

本文提供激光雷达与IMU联合标定的详细实战教程,重点解析lidar_imu_calib工具在VLP-16上的应用。从环境部署、数据采集技巧到参数配置与结果验证,手把手指导完成标定全流程,并详解如何在LIO-SAM等SLAM系统中应用标定结果,确保传感器融合精度。

food6的博客 475

defer对象异步

var defer = $.Deferred(); //构建异步对象 setTimeout(function(){ defer.resolve( 5 ); },1000); var filtered = defer.then(function( value ) { return value * 2; }); filtered.done(function( value ) { console.log...

qq_25118431的博客 251

3D Slicer中文教程(三)—数据加载及保存方式

1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表。 请注意,仅部分支持列出的某些格式。 ——对于一些更复杂的格式(特别是DWI),建议首先使用DICOM到n...

weixin_33676492的博客 5533

Unity 的延时加载(defer resolve)

Unity 的延时加载(defer resolve)

左手福鲨 右手幸鲨 1341

HWSD2.0土壤数据处理实战:从下载到属性提取全流程解析

本文详细解析了HWSD2.0全球土壤数据库从数据下载、属性筛选到GIS空间连接与提取的全流程实战方法。重点介绍了如何利用ArcGIS Pro等工具,将土壤单元编码与黏粒含量等属性表关联,最终生成全球土壤属性专题栅格图,为农业规划与生态研究提供关键数据支撑。

weixin_29214691的博客 610

企业AI Agent的审计与合规

本文将带你从**“0基础理解企业AI Agent审计与合规”到核心概念梳理:用大白话+学术定义拆解什么是“企业AI Agent”、“可审计性(Auditability)”、“可解释性(Explainability,XAI)≠可审计性”、“合规性(Compliance)”、“黑盒拆解的三层维度”等硬核但必须掌握的概念;风险与合规背景:从**内部风险(数据泄露、误操作、模型偏差)和。

Java大师兄的博客 301

nodejs 的q模块

同时向前端返回多个接口参数直接上代码var Q = require('q');//返回规格function getGuige() { var deferred = Q.defer() ; DB.DB('guige',function (db,collection) { collection.find({}).sort({time: -1}).toArray(function(err,

lily_xiao的博客 766

小白投资理财 - 解读威廉分形指标 Williams Fractals

威廉分形指标用于识别价格趋势中的关键点,帮助判断支撑位和阻力位。

wumingxiaoyao的博客 4333

Angularjs (二)

1、AngularJS中,子作用域一般都会通过JavaScript原型继承机制继承其父作用域的属性和方法。但有一个例外:在directive中使用scope: { ... },这种方式创建的作用域是一个独立的"Isolate"作用域,它也有父作用域,但父作用域不在其原型链上,不会对父作用域进行原型继承。这种方式定义作用域通常用于构造可复用的directive组件。 作用域的原型继承是非常简...

1077

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2133

避坑指南:在Linux服务器上用Conda安装antiSMASH 5.2.0(解决Jinja2报错和Matplotlib权限问题)

本文详细介绍了在Linux服务器上使用Conda安装antiSMASH 5.2.0的避坑指南,重点解决了Jinja2报错和Matplotlib权限问题。通过创建专用conda环境、安装指定版本依赖包和配置缓存目录,帮助用户顺利完成antiSMASH的本地部署,适用于批量处理基因组分析任务。

weixin_26911099的博客 314

Promise的deferred对象详解

基础知识简单说,deferred 对象就回调函数解决方案。在英语中,defer的意思是"延迟",所以 deferred 对象的含义就是"延迟"到未来某个点再执行。所以也叫延迟对象。我们先看...

文摘资讯 1057

〔重庆理工大学〕计算机组成原理课设报告--16位单周期CPU设计

本课程设计的实验平台为Altera Quartus II 软件和Altera Cyclone V Starter 工具箱。(1)Cyclone V是Altera FPGAs家族的一类,它面向低功耗应用。Cyclone V GX 5CGXFC5C6F27C7N 芯片有不同的转换器,按钮,LED灯,七段显示器,HDMI接口,SD卡读卡器以及其他链接等。Cyclone V GX 5CGXFC5C6F27C7N是Starter工具箱的重要组件。(2)测试台包含在测设备(DUT)和用于仿真的模拟输入。

Pretty Boy Fox的博客 1066

【NodeJS】《使用 promise 替代回调函数》

《使用 promise 替代回调函数》知识点理解 Promise 概念,为什么需要 promise学习 q 的 API,利用 q 来替代回调函数(https://github.com/kriskowal/q )课程内容第五课(https://github.com/alsotang/node-lessons/tree/master/lesson5 )讲述了如何使用 async 来控制并发。async...

DreamSeeker_1314的博客 460

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NodeJS中将回调函数转换成Promise的例子

基于STACKOVERFLOW中的例子,原文请参考这里

boyzhoulin的专栏 3457

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NodeJS-Promise、await、async异步变同步

由于公司需要,部分JAVA_WEB接口开发改为NodeJS。 NodeJS与JAVA相比起来较为轻量级,异步请求调用。 总的来说,适用于做微服务。在使用NodeJS的异步调用同时,难免会遇到需要同步的时候。 不说多了,上代码 异步代码 const request = require('request'); let synchronous_post = function

u012765616的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

nodejs request模块使用promise 返回回调函数中的值

var request = require('request'); //exports.httprequest = (requestData) =>{ function httprequest(requestData){ return new Promise((resolve, reject)=>{ var url = "http://xx...

abnc8791的博客 1062

在Nodejs中 什么是Promise 如何使用Promise处理异步操作

引言Promise的基本概念和作用说明什么是Promise?Promise的作用使用Promise的不同角度的功能思路示例一:创建和使用基本的Promise示例二:链式调用多个Promise示例三:处理并发的异步操作示例四:处理竞争条件下的异步操作示例五:使用async/await简化Promise实际工作开发中的使用技巧错误处理性能优化调试技巧测试策略实际案例分享Promise是ES6引入的一种用于处理异步操作的对象。它代表了一个异步操作的最终完成(或失败)及其结果值。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1412

Nodejs 之promise对象详解

在了解promise之前,我们先学习几个概念 回调函数: 当一个函数作为参数传入另一个参数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数。我们熟悉的定时器中就存在有回调函数: function fn(){ console.log('你好,anni'); } setTimeout(fn,2000) 在满足2秒之后才会执行 fn 函数中的内容,此时 fn 就是回调函数。 在了解了回调函数之后,与之相对应的概念是“同步任务”。 同步任务在主线程上排队执行,只

weixin_50828895的博客 4682

Nodejs 之 promise

express一、CommonJs二、Promise2.1 回调地狱2.2 promise是什么2.2.1 抽象表达2.2.2 具体表达2.2.3 Promise有三个状态2.2.4 promise的状态改变2.3 promise基本流程2.4 promise的优势2.4.1. 指定回调函数的方式更加灵活2.4.2 支持链式调用, 可以解决回调地狱问题2.5 promise的使用:解决回调地狱问题2.6 async/await 同时使用2.7 Promise的使用2.8 Promise的几个关键问题 一、C

loeyln的博客 862

浅谈NodeJS之Promise

啥是Promise? Promise是一个构造函数,方法有all、reject、resolve这几个,原型上有then、catch等方法。那么new Promise出来的对象肯定就有then、catch方法。跟着我一步一步学习吧。本文能让你对Promise有一个颠覆的认识。 让我们new一个吧: var promise = new Promise(function(reso...

Gabriel的专栏 7733

nodejs中Promise使用

promise 英文意思是 诺言; 许诺; 承诺; 获得成功的迹象; 吉兆; 迹象; 用法如字面意思,是一种可能未发生的许诺 js中的代码存在异步执行,一般通过回调函数返回结果,如ajax调用后会在回调函数中获取返回值,但是js代码没有等待返回值而继续向下执行了。现实中程序代码是实现有先后顺序的业务逻辑的,为了让异步代码按照指定的顺序执行,这里使用Promise完成 ...

计算机技术记录 1311

将CallBack改写成Promise

CallBack回调函数是js的特色之一, 但CallBack回调方法, 非常容易造成回调地狱(callback hell), 回调地狱不仅形象丑陋,而且代码难以维护 以nodejs读取文件为例 const fs = require("fs"); // 回调函数的方式 fs.readFile('./zhaoolee.txt', (err, data)=&gt...

zhaoolee的优快云博客 1461

【NodeJS教程】第4节:Promise 与 async/await

🔥 Promise与async/await摘要 本文系统讲解了现代JS异步编程核心: 1️⃣ Promise基础:三种状态(Pending/Fulfilled/Rejected)及创建方法,通过then/catch链式调用避免回调地狱 2️⃣ async/await语法:async函数自动返回Promise,await实现同步式异步代码编写 3️⃣ 实战对比:演示了文件读取从回调→Promise→async/await的演进 4️⃣ 高频面试题:包含Promise状态机制、错误处理、Promise.all

silverclayz的技术分享 1183

Nodejs Promise对象

Promise对象 1. promise用来做什么? 我们的需求是一次的去执行异步代码 我们的做法是在异步请求成功后的回调函数里,执行下一个异步请求 但是这样就出现了回调地狱(回调函数中嵌套了回调函数,代码的阅读性 低,维护不变,让人看着害怕) promise就是用来解决回调地狱的 回调地狱示例: // 需求:一次的读取a,b,c这三个文件 const fs = require("fs"); // 读a文件 fs.readFile(`${__dirname}/etc/a.txt`, "utf-8",

码小余の博客 3691

Nodejs——request-promise获取返回值

vue使用request-promise调用接口获取数据 安装依赖: npm install --save request npm install --save request-promise 若想方法返回接口返回值,需要使用回调函数,因为是异步操作 1、demo如下 var crypto = require('crypto') function getDevices() { }...

tellmewsm 8065
上一篇: NodeJS中使用async控制并发-@CAOLAN
下一篇: NodeJS中使用benchmark进行基准测试-@alsotang
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值