У меня есть код ниже, который не разрешается. f2 решает, поэтому я не буду добавлять этот код, это f1 У меня проблема.
Я вызываю функцию, и она попадает во внутреннее большинство, если она вызывает функцию "find", которая выполняет функцию findId
, которая возвращает Id отлично, тогда она выполняет editId
но не разрешает document replaced
+ true, который я знаю он появляется, когда появляется журнал контекста.
Ожидаемое поведение:
Это должно разрешить резервную копию до верхнего обещания и достичь context.done()
но это не
Это может быть простой проблемой с точки зрения того, где я размещаю новые обещания и т.д., Но я некоторое время боролся со структурой этого.
Спасибо за понимание.
module.exports = function (context, req) {
var documentUrl = xyz;
client.readDocument(documentUrl, (err, a) => {
var f1 = fun1(a,b,c);
var f2 = fun2(a,b,c);
Promise.all([f1, f2]).then(function(results){ //parallel
context.log(results[0], results[1]);
context.done();
});
});
}
function fun1 (a,b,c){
if (a[0].stuff.length > 0) {
var stuffArray = [];
for (i = 0; i < a[0].stuff.length; i++) {
if (a[0].stuff[i].morestuff !== null && a[0].stuff[i].otherstuff !== null) {
if (a[0].stuff[i].Id== null) {
var Id = a[0].id + '_' + i;
var find = findId (a, Id, function(res){
context.log ("findFeedback: found");
context.log(res);
editId(context, res);
});
stuffArray.push(find);
}
} else {
stuffArray.push(i + " shouldn't have Id");
}
}
return Promise.all(stuffArray);
} else {
return ('No stuff');
}
}
function findId(a, Id, callback) {
var documentUrl = myUrl/id;
client.readDocument(documentUrl, (err, result) => {
if (err) {
if (err) {
return(err);
}
} else {
callback(result);
}
});
}
function editId(context, res) {
return new Promise((resolve, reject) => {
var documentUrl = myUrl/res.otherId;
client.readDocument(documentUrl, (err, result) => {
if (err) {
if (err.code == HttpStatusCodes.NOTFOUND) {
context.log('Post does not exist');
resolve('Post does not exist');
} else {
context.log(err);
resolve(err);
}
} else {
context.log('Post exists');
// here i edit some stuff which works fine
client.replaceDocument(documentUrl, result, (err, result) => {
if(err) {
context.log(err);
resolve('Document replaced ' + false);
} else {
context.log('replaced document ' + result);
resolve('Document replaced ' + true);
// This is where my context log ends it does not resolve back up
}
});
}
});
});
};
findId
требует return new Promise((resolve,reject) => { });
обернутый вокруг него.
И затем вы можете вызвать editId
в findId
и заменить callback(result)
с помощью resolve(editId(context, result));
После этого замените var find
в fun1
на var find = findId (a, id)
и удалите требование обратного вызова от findId
Дело здесь в том, чтобы сделать ваш код последовательным.
Я думаю, вы должны перенести все свои функции обратного вызова в Promise. Это сделает ваш код чище, проще и не станет спагетти.
У меня недостаточно контекста для тестирования. Поэтому я просто немного пытаюсь реорганизовать ваш код. Надеюсь, это поможет вам в каком-то аспекте.
функция findId должна возвращать обещание вместо использования обратного вызова:
function findId(Id) {
return new Promise((resolve, reject) => {
var documentUrl = myUrl / id;
client.readDocument(documentUrl, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
в функции fun1 у вас есть асинхронный код в цикле for. Это не сработает, потому что асинхронный код не будет ждать, пока он не принесет вам результат. Поэтому я рефакторинг, findId
идентификатор, вы должны вызвать findId
в stuffArr
. Затем я сопоставляю эти идентификаторы в список функции findId
. Делая это, мы можем использовать Promise.all, чтобы ждать выполнения всех обещаний.
function fun1(a, b, c) {
if (a[0].stuff.length > 0) {
var stuffArray = [];
for (i = 0; i < a[0].stuff.length; i++) {
if (
a[0].stuff[i].morestuff !== null &&
a[0].stuff[i].otherstuff !== null
) {
if (a[0].stuff[i].Id == null) {
var Id = a[0].id + "_" + i;
var promise = findId(Id)
.then(res => editId(context, res))
.catch(err => i + " Some error");
stuffArray.push(promise);
} else {
// don't know what you want to do here
}
} else {
stuffArray.push(i + " shouldn't have Id");
}
}
return Promise.all(stuffFindPromises);
} else {
return Promise.resolve("No stuff");
}
}
Надеюсь это поможет.