cari

Rumah  >  Soal Jawab  >  teks badan

node.js - 请教关于node异步循环的问题

代码很简单,如下:

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:

问题:

请问如何解决?

迷茫迷茫2788 hari yang lalu679

membalas semua(2)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:23:38

    1. 安装万能的async:sudo npm install async
    2. 把代码改成:
    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的文档。

    balas
    0
  • 高洛峰

    高洛峰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) {
            //没找到或超时
        });
    

    balas
    0
  • Batalbalas