简述
在使用node的时候,常常需要使用的request
回调数据,但是在声明全局变量后,再在request
赋值,往往在外层是获取不到里面已经赋值的参数,因为request
它是异步调用数据,在你方法在执行的时候,request
并没有按顺序执行,因此你获取不到赋值后的参数,这是就需要用到Promise
。
复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受。那么第一个问题来了,Promise是什么玩意呢?是一个类?对象?数组?函数?
什么是promise?
Promise可能大家都不陌生,因为Promise规范已经出来好一段时间了,同时Promise也已经纳入了ES6,而且高版本的chrome、firefox浏览器都已经原生实现了Promise,只不过和现如今流行的类Promise类库相比少些API。
所谓Promise,字面上可以理解为“承诺”,就是说A调用B,B返回一个“承诺”给A,然后A就可以在写计划的时候这么写:当B返回结果给我的时候,A执行方案S1,反之如果B因为什么原因没有给到A想要的结果,那么A执行应急方案S2,这样一来,所有的潜在风险都在A的可控范围之内了。
Promise规范如下:
- 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
- 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
promise原理分析
可以看到promise的规范并不是很多,下面我们一边分析promise一边自己写一个promise的实现。Promise实现的大致思路如下:
构造函数Promise接受一个函数resolver,可以理解为传入一个异步任务,resolver接受两个参数,一个是成功时的回调,一个是失败时的回调,这两参数和通过then传入的参数是对等的。
其次是then的实现,由于Promise要求then必须返回一个promise,所以在then调用的时候会新生成一个promise,挂在当前promise的_next上,同一个promise多次调用都只会返回之前生成的_next。
由于then方法接受的两个参数都是可选的,而且类型也没限制,可以是函数,也可以是一个具体的值,还可以是另一个promise。下面是then的具体实现:
// 在 Promise里面执行异步方法
// resolve 参数是通过后执行 ,reject是不通过执行
function wait(duration){
return new Promise(function(resolve, reject) {
setTimeout(resolve,duration);
})
}
//在函数wait执行.then()方法,执行下一步同步
wait.then(function(){alert('hello')}).then(function(){console.log('world')})
Node rquest 参数全局变量
//缓存
var getData = require('../config/basic_ajax');
var categoriesTree = function(cid, callResult) {
function promiseParam() {
return new Promise(function(resolve, reject) {
request({
url: system_config_dev.url + url,
method: 'get',
json: true,
headers: {
userId: userData.id || 0
},
async: true
}, function (error, res, data) {
if (!error && res.statusCode == 200) {
resolve(data);
}
});
})
}
promiseParam().then(function(data) {
console.log(data)//这个就是全局的参数
})
}
module.exports = categoriesTree;
参考资料
JavaScript进阶之路——认识和使用Promise,重构你的Js代码: https://www.cnblogs.com/yunfeifei/p/4453690.html
JavaScript Promise迷你书(中文版) http://liubin.github.io/promises-book/
JavaScript Promise启示录 http://www.csdn.net/article/2014-05-28/2819979-JavaScript-Promise
用Promise组织程序 http://www.w3ctech.com/topic/721