Javascript 循环的承诺与集合

Javascript 循环的承诺与集合,javascript,node.js,asynchronous,promise,q,Javascript,Node.js,Asynchronous,Promise,Q,请帮助我理解我的代码有什么问题 所以我要做的是调用一个异步调用来获取计数。我已经把它变成了一个承诺 function getCount(client) { var xml = "<urn:mgmtISCSIGetTargetList> </urn:mgmtISCSIGetTargetList>"; client.MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml, function (err, result)

请帮助我理解我的代码有什么问题

所以我要做的是调用一个异步调用来获取计数。我已经把它变成了一个承诺

function getCount(client) {
    var xml = "<urn:mgmtISCSIGetTargetList> </urn:mgmtISCSIGetTargetList>";
    client.MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml, function (err, result) {

        if (err) {
            logger.error(err);
            debug(err);
            return deferred.reject(err);
        }
            deferred.resolve(parseInt(result.list.targetCount));
        }
    });

    return deferred.promise;
};
我得到的结果是:

3 which is from deferred.resolve(index);
index 1 is bad news which is hard coded failure.
我知道这是一篇很长的帖子,但是有人看到我把这两个承诺链接在一起的错误吗

我将az改为:

function az(client, index) {
    var xml = "<urn:mgmtISCSIGetTargetList> </urn:mgmtISCSIGetTargetList>";
    client.MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml, function (err, result) {

            if (err) {
                return deferred.reject(err);
            }

            if (1 === index) {
                console.log('index 1 is bad news');
                return deferred.reject("Blew up");
            }

            console.log('after the loop with index ' + index);
            deferred.resolve(index + 30);
        }
    );
    return deferred.promise;
};
功能az(客户端,索引){
var xml=“”;
MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml,函数(err,结果){
如果(错误){
延迟返回。拒绝(错误);
}
如果(1==索引){
log('索引1是坏消息');
延期退货。拒收(“爆炸”);
}
log('在带有索引'+索引的循环之后);
延迟解决(索引+30);
}
);
回报。承诺;
};
您只能解决(履行/拒绝)一次承诺。您已
延迟返回。拒绝(“爆炸”)看起来很像设计气味,或者错误的理解

我需要进行更多的异步调用,就像返回第一个承诺一样多。假定稍后执行的代码是另一个承诺

每个异步任务都应该有自己的承诺。我从描述中所期望的是

getCount(client).then(function (count) {
    for (var i=0; i<count; i++)
        az(client, i).then(console.log);
})

您在哪里构造
deferred
变量?您使用的承诺库是什么?var deferred=require('Q)。deferred和我使用Q包和deferred您期望什么输出?什么不起作用?我试图做的是如果循环中的任何项都有问题要抛出和异常。拒绝不是正确的方法吗?是的,是的,但您似乎错误地放置了循环。或者该
mgmtISCSIGetTargetList
方法一次返回所有项,而您甚至不需要多次调用它?我将循环放错了位置。一定是。mgmtISCSIGetTargetList一次返回一个项目很高兴听到我的猜测是正确的:-)那么当
az()
产生一个单一值的承诺时它能工作吗?不,它不能。。。这就是我现在拥有的。我按原样使用您为数组提交的代码,并将az改为:如上所述,我看到了输出:一切正常。所有结果:[3,3,3]在索引为0的循环之后索引为1是坏消息,在索引为2的循环出现故障之后,从未看到“出现了一些错误。我将按原样添加az代码。”。
function az(client, index) {
    var xml = "<urn:mgmtISCSIGetTargetList> </urn:mgmtISCSIGetTargetList>";
    client.MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml, function (err, result) {

            if (err) {
                return deferred.reject(err);
            }

            if (1 === index) {
                console.log('index 1 is bad news');
                return deferred.reject("Blew up");
            }

            console.log('after the loop with index ' + index);
            deferred.resolve(index + 30);
        }
    );
    return deferred.promise;
};
getCount(client).then(function (count) {
    for (var i=0; i<count; i++)
        az(client, i).then(console.log);
})
getCount(client).then(function (count) {
    var promises = [];
    for (var i=0; i<count; i++)
        promises.push(az(client, i));
    return Q.all(promises);
}).then(function(results) {
    console.log("everything went right. All results:", results);
}, function(err) {
    console.log("something (either getCount, or one of the az calls) blew up", err);
});