关于Node request 全局变量问题

简述

在使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值