【发布时间】:2014-03-11 15:42:10
【问题描述】:
请帮助我了解我的代码有什么问题。
所以我要做的是调用异步调用来获取计数。我已经把它变成了一个承诺。
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;
};
一旦我使用上述承诺获得计数,我需要进行更多的异步调用,与第一个承诺的返回一样多。
假设稍后执行的代码是另一个承诺。 该代码是:
function az(client, index) {
var xml = "<urn:mgmtISCSIGetTargetList> </urn:mgmtISCSIGetTargetList>";
client.MgmtServer.MgmtServer.mgmtISCSIGetTargetList(xml, function (err, result) {
if (err) {
return deferred.reject(err);
}
var i;
for (i = 0; i < index; i++) {
if (1 === i) {
console.log('index 1 is bad news');
return deferred.reject("Blew up");
}
}
console.log('after the loop');
deferred.resolve(index);
}
);
return deferred.promise;
};
仅出于测试目的,我对 1 的索引进行了硬编码,拒绝了承诺。 当我把承诺放在一起时,我没有看到我所期望的。 代码是:
getCount(client).then(
function (count) {
return az(client, count).then(console.log);
}
).catch(
function (err) {
console.log('caught an error from outer promise');
console.log(err);
}
);
我得到的输出是:
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;
};
【问题讨论】:
-
你在哪里构造
deferred变量? -
你使用的是什么 promise 库?
-
var defered = require('Q).deferred 我使用 Q 包和 deferred
-
您期望的输出是什么?什么不起作用?
标签: javascript node.js asynchronous promise q