关于循环拉取接口的问题
发布于 8 年前 作者 ea7son 4719 次浏览 来自 问答

function loop(fn) { return fn.then(function(wrapper) { sleep(2000); return !wrapper.done ? loop(fn) : wrapper.value; },function(err){ console.log(err.message); }); } function waitForLogin(tip, uuid) { return new Promise(function(resolve, reject) { request({ uri: ‘https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login’, qs: { tip: tip, uuid: uuid, _: (new Date()).getTime() } }).then(function(data) { console.log(data); var done = false; var code = /window.code=(\d+)/.exec(data)[1]; if (code === ‘201’) { console.log(‘成功扫描,请在手机上点击确认以登录’); gobal.tip = 0; } else if (code === ‘200’) { done = true; console.log(‘正在登录…’); var uri = /window.redirect_uri="(\S+?)";/.exec(data) + ‘&fun=new’ console.log(uri); gobal.redirect_uri = uri; } resolve({ done: done, value: code }) }).catch(function(err) { reject(new Error(err.message)); }); }) } //最后调用 Promise.then(function(){ loop(waitForLogin(gobal.tip, gobal.uuid)); }) 现在loop的循环能正常进行,但是waitForLogin中的data没有输出,是不是我对promise的理解还不对哇,或者有没有其他更好的方式解决这种问题!

14 回复

sleep是什么鬼。。。我一般会写成递归,node-inspector看了看似乎也没见堆空间不足。。。虽然我还是觉得有问题

咦?微信!这里应该是长连接,不建议写定时循环。服务器那边27000ms后会自己断开连接。可以参考

https://github.com/HalfdogStudio/wechat-user-bot

稳定性还行,有兴趣port到服务器上不?

@reverland sleep.js 高级语言写惯了。。写着玩,https://github.com/nodeman777/whoremovedyou 之前有人用Python写了个程序可以检测有谁在微信上删了你好友,我打算用node写一个,刚学promise,很多一知半解

第一次部署到dotcloud上。。。 但好像手机一掉线web也就掉线了…

@reverland 我看看他是怎么实现的。

哈 接口已经被微信封了脚本失效了

@chemdemo 好吧,不过我这代码哪里写得有问题,能赐教下么??

request 用的是request-promise吗?

而且loop返回的是一个promise,不能把你想要的结果拿回去。loop应该返回一个promise吧,then的参数里面有你要的value

@Acceptedlc loop 在返回promise之前会执行return !wrapper.done ? loop(fn) : wrapper.value;在wapper.done ==false时loop(fn)会继续执行哇,现在就是没有继续执行。

var conut = 0; function task(){ return new Promise(resolve => { console.log(‘执行了promise’); if(conut++>10){ resolve({done:true,value:‘我爱北京天安门’}); }else{ resolve({done:false}) } }) }

var times = 0; function loop(fn){ console.log(‘times’,times++); return fn.then(wrapper => { return !wrapper.done ? loop(fn) : wrapper.value; }) }

loop(task()).then(data => console.log(data)); 我觉得,你的request请求只执行了一次,因为一个promise中的function只执行了一次。后面不断then这个promise是没有用的。你可以运行一下我的代码看一下。

@Acceptedlc 好,我明天跑下代码再看看 自豪地采用 CNodeJS ionic

@Acceptedlc var conut = 0; function task(){ return new Promise(resolve => { console.log(‘执行了promise’); if(conut++>10){ resolve({done:true,value:‘我爱北京天安门’}); }else{ resolve({done:false}) } }) }

	var times = 0;
	function loop(fn){
		console.log('times',times++);
		//sleep(2000);
		return fn().then(wrapper => {
			return !wrapper.done ? loop(fn) : wrapper.value;
		})
	}

	loop(task).then(data => console.log(data));
	
	#多谢,终于搞明白了,改了下代码,loop传入函数名,在loop里执行函数,这样task就能执行到了。。#
回到顶部