这两天被一个问题困扰住了。 比如 :我现在有一个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. 期望大牛们多多关照 感激不尽。
async.parallel 也行
async是手动档, promise是自动档
@baka397 可以帮我解答一下 我那三个问题吗?
@FwDevil 想用对应关系,那就使用Object
呗,你也可以叫做map
。
- 没看到你
callback
是哪个,但是肯定是拿不到你想要的结果的,因为异步,你懂 - 回调函数和普通函数并没有不同,当然可以调用外部值,这是闭包特性,没有任何问题。话说你的
getData
函数就是个闭包,保持了每一次的i值,不至于循环完毕的时候,用的同样的i。 - 其实和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