幫我理解我的代碼有什麼問題。承諾和收集迴路
所以我要做的就是調用異步調用來計數。我已經把它變成了一個承諾。
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.
我知道這是一個很長的帖子,但任何人看到的東西,我在這些鏈接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;
};
你在哪裏構造'deferred'變量? – Bergi
你使用什麼承諾庫? – Bergi
vardeffered = require('Q).deferred並使用Q包並推遲 – reza