Array.push不使用promisified函数,但回调不保留消息

时间:2017-06-12 03:01:02

标签: node.js

注 - 调用promisified函数后,消息变量不保留数据。回调给出了null数组。

代码 -

'use strict';
const Promise = require('bluebird');
let _connectResolve, _connectReject, onConnected = new Promise((resolve, reject) => {
        _connectResolve = resolve;
        _connectReject = reject;
    }),
    redis = require("redis"),
    redisClient = redis.createClient({
        host: 'localhost',
        port: 6379
    });
Promise.promisifyAll(redis.RedisClient.prototype);

redisClient.on('connect', _connectResolve);
const results = Promise.all([
    'it/0I0g2I3D312s192u0U3k/10es.zip',
    'items/25210B0c0Q1L3u0X462g/10ges.zip',
    'items/2x0n440V1A1n3x1y0f1K/Fs.zip',
    'items/2l023931u0w1S2a3j/es.zip',
    'items/2O2x212i3t0B2h/es.zip',
]);

var message = [];
var a = Promise.promisify(function(callback) {
      results.map(function(result) {
        redisClient.getAsync(result).then(function(reply) {
            if (reply == null) {
                message.push({
                    "key": result,
                    "bucket_name": 'dsdds'
                });
            }
            //console.log(message);
        });
        callback(null, message);
    });
});

onConnected.then(() => {
    Promise.resolve(a()).then(function(message) {
        console.log(message);
    });
});

输出 - 消息未定义

1 个答案:

答案 0 :(得分:0)

你如何对此进行编码有很多不妥之处。异步操作按照自己的计划运行,并在将来完成一些不确定的时间。因此,您不能在其中使用带有异步操作的.map()循环,然后期望在.map()循环之后立即准备好结果。相反,您必须使用工具来跟踪.map()循环中的所有异步操作何时完成,并且仅当该工具告诉您所有操作都已完成时才查看结果。

此外,Promise.promisify()有一些非常奇怪的用法使得它看起来像你认为普通函数会以某种方式神奇地管理其中的异步操作。它不会。您只能在具有特定调用约定的异步函数上使用Promise.promisify()

幸运的是,由于您拥有Bluebird promise库,您可以使用其工具来帮助您执行以下操作:

function a() {
    let message = [];
    return Promise.map(results, function(result) {
        return redisClient.getAsync(result).then(function(reply) {
            if (reply == null) {
                message.push({
                    "key": result,
                    "bucket_name": 'dsdds'
                });
            }
        });
    }).then(function() {
        // make the message array be the resolved value of the returned promise
        return message;
    });
});

onConnected.then(() => {
    a().then(function(message) {
        console.log(message);
    });
});