代码很简单,如下:
var find;
data.some(function(ip) {
client.sismember(url+':ip', ip, function(err, mem) {
!mem && (find = ip);
console.log('redis:' + find);
});
console.log(find);
return find;
});
原理很简单:
结果,代码中有两个console:
问题:
请问如何解决?
伊谢尔伦2017-04-17 11:23:38
sudo npm install async
var async = require('async');
...
async.detect(
data,
function(ip, cb) {
client.sismember(url+':ip', ip, function(err, mem) {
console.log('redis:' + find);
cb(!mem);
});
},
function(result) {
find = result;
console.log(find);
});
可以看下github上async的文档。
高洛峰2017-04-17 11:23:38
用q.js的解决方案
npm i q
var Q = require('q');
function find (data, url, timeout) {
var deferred = Q.defer();
var n = data.length;
data.forEach(function (ip) {
Q.ninvoke(client, 'sismember', url + ':ip', ip)
.then(function (ret) {
if(ret) {
deferred.resolve(ip);
} else if (--n <= 0) {
deferred.reject(new Error('Not found!'));
}
});
});
return Q.timeout(defered.promise, timeout);
}
//以上只用写一次,以下是使用方法
find(data, url, 1000)
.then(function (ip) {
//成功找到
console.log('redis:' + find);
}).fail(function (reason) {
//没找到或超时
});