小白求问:关于node CallBack 作用域的问题请大牛解答
发布于 9 年前 作者 FwDevil 3572 次浏览 最后一次编辑是 8 年前 来自 问答

这两天被一个问题困扰住了。 比如 :我现在有一个ID数组, 每个ID都要向Server获取每个ID对应的一些数据,但是返回的数据不回告诉我这些数据是属于那个ID的。 如果按其他语言 一个同步就可以搞定。

但是Node是异步执行 我就不知道该如何处理了。
同一时间所有ID向Server并发获取数据。 之后所有数据返回时 怎么与他发送的Id对应起来?

我的写法是: (但是我感觉存在超多问题) var ArrayID=[{id:xxxxxxx},{id:xxxxx},{id:xxxxxxx},******] //id数据很多 function getData( y ){ var i=y; var req = http.request(Url_Connect,function (res){ res.on(“data”,function(chunk){ //获取数据 Array[i].data=chunk; }) } req.write(ArrayID[i]); //发送ID req.end(); }//getData for(i = 0; i<ArrayID.length,i++) { getData(i); } 问题:1.如果http.request()方法的callback的回调方法会时 i 的值等于什么。
2.回调方法内部调用外部的值 会不会产生什么错误 并且 可以这样写么。 3.在我理解,回调方法:是吧回调函数 插入 执行队列中。 但是如果值插入了执行代码 , 那执行代码所依赖上下文变量 该怎么调用 就比如上文的 i 变量 他是定义在回调方法外部的。

我刚刚接触NodeJs. 期望大牛们多多关照 感激不尽。

9 回复

async.parallel 也行

async是手动档, promise是自动档

@baka397 可以帮我解答一下 我那三个问题吗?

@FwDevil 想用对应关系,那就使用Object呗,你也可以叫做map

  1. 没看到你callback是哪个,但是肯定是拿不到你想要的结果的,因为异步,你懂
  2. 回调函数和普通函数并没有不同,当然可以调用外部值,这是闭包特性,没有任何问题。话说你的getData函数就是个闭包,保持了每一次的i值,不至于循环完毕的时候,用的同样的i。
  3. 其实和2是一个问题,建议你找相关知识理解一下闭包~不难的,comme on!

PS:如果理解有误,还请大牛帮忙更正~另外,楼主格式化代码吧,markdown,半个小时都不用

promise怎么传参数

var http=require('http');
 var httpPormise= new Promise(  (resolve, reject) =>{
var req = http.request(url,  (res) =>{ 
    res.on("data",(chunk)=>{ 
        data+=chunk;
     });
    res.on("end",()=>{
        resolve(data);
    });
    res.on('error',(err)=>{
        reject(err); 
    });
}); req.end();

});

httpPormise 调用的时候怎么把 url传进去?

如果外面包装一层

var http=require('http');
function httpPromise(url){
 var data='';
 var Pormise= new Promise(  (resolve, reject) =>{
var req = http.request(url,  (res) =>{ 
    res.on("data",(chunk)=>{  
        data+=chunk;
     });
    res.on("end",()=>{
        resolve(data);
    });
    res.on('error',(err)=>{
        reject(err); 
    });
}); req.end();
});
return {get:function(url){   return Pormise;                       }
        }
}
console.log(httpPromise);
httpPromise.get('http://www.google.com')
.then(
       (data)=>{    console.log(data);}         
     )
    .then(
       (err)=>{ console.log(err) }    
    );

提示 TypeError: httpPromise.get is not a function at Object.<anonymous>

用 ArrayID.foreach(function(i){ getData(i); }) 执行

@FwDevil 用段测试代码来说明问题(用random模拟异步时的时间差异),见下 var array_id = [0, 1, 2, 3], new_array_id = [];

function getData(index) {
    setTimeout(function() {
        console.log(index);
        new_array_id[index] = array_id[index];
        console.log(new_array_id);
    }, Math.random() * 10)
}

array_id.forEach(function(key, index) {
    getData(index);
});

1.由于index已经没有引用关系(不会被更新),所以,index是你传入的值 2.不会产生什么错误,可以这样使用.只是在你的callback执行完成后,index才会从内存中被释放(实际情况中这里更复杂,比较容易造成内存泄漏) 3.如果内部不存在index值,就会一直往外部找,见下代码

var array_id=[0,1,2,3],new_array_id=[],index=0;
function getData(){
  setTimeout(function(){
    console.log(index);
    new_array_id[index]=array_id[index];
    console.log(new_array_id);
  },Math.random()*10)
}

array_id.forEach(function(key,new_index){
  index=new_index;
  getData();
});

@yakczh 哈哈~又发现一只 data+=chunk; CC @JacksonTian

回到顶部