【发布时间】:2019-01-23 21:44:31
【问题描述】:
一段时间以来,我一直在为复杂的 for/promise 化妆而苦苦挣扎。我不能使用 async/await,因为 azure functions v1 不支持它。
问题如下...
我得到了一个数组allArray
现在我想完成类似下面的事情,但我似乎很难过。
编辑:
问题似乎是函数到达loop并通过for循环发送allArray[0],我得到context.log("One: " + results[0], "Two: " + results[1]);,但它在发送空anotherArray之前没有等待,它也没有启动var call下一个循环也不行。
我的日志如下所示:
no thanks (oneAnalysis)
No things (twoAnalysis)
Done again
[]
Done
One: " + results[0], "Two: " + results[1]
Function completed
任何帮助将不胜感激。
module.exports = function (context, allArray) {
var loopPromise = loop(context, allArray);
Promise.all([loopPromise]).then(function(results){
context.log('Done again');
context.log(results[0]);
context.done()
});
}
function loop (context, allArray) {
var anotherArray = [];
for (i = 0; i < allArray.length; i++) {
var promiseOne = oneAnalysis (context, allArray[i]);
var promiseTwo = twoAnalysis (context, allArray[i]);
Promise.all([promiseOne, promiseTwo]).then(function(results){
context.log('Done');
context.log("One: " + results[0], "Two: " + results[1]);
var Id = allArray[i].Id;
var call = callCF (context, Id)
anotherArray.push(call);
});
}
return Promise.all(anotherArray);
}
function oneAnalysis (context, input) {
if (input.something.length > 0) {
var somethingArray = [];
for (i = 0; i < input.something.length; i++) {
if (stuff) {
var queue = queue;
var text = {
text
}
var create = createMessage(text, queue, context);
somethingArray.push(create);
} else {
somethingArray.push("no thanks");
}
}
return Promise.all(somethingArray);
} else {
return ("No things");
}
}
function twoAnalysis (context, input) {
same as oneAnalysis
}
function createMessage(text, queue, context) {
return new Promise((resolve, reject) => {
queueService.createMessage(queue, JSON.stringify(text), function(error) {
if (!error) {
context.log('Message inserted:', text);
resolve ('Message inserted: ' + text)
}
else {
context.log('All done');
resolve ('error');
}
});
});
}
function callCF(context, id) {
return new Promise((resolve, reject) => {
Do http request and resolve on end
});
}
【问题讨论】:
-
这段代码有什么地方不工作吗?
-
道歉 - 见编辑
-
我在
oneAnalysis上没有看到任何解决或拒绝的呼叫。它是丢失还是我应该假设它被某些外部依赖项调用? -
@ErickRuizdeChavez 在之前的承诺/循环中我不必总是解决/拒绝 - 我
return而是在下一层解决/拒绝,如果它到达那里(即在创建消息时)跨度> -
我正在重构您的“伪”代码。我注意到的一件事是你有额外的承诺。我稍后会将其作为答案发布,但我无法对其进行测试,因为它不会按原样工作。
标签: javascript node.js for-loop promise resolve