Node.js Обещания во вложенных обратных вызовах в Обещаниях в Обещаниях не разрешаются

1

У меня есть код ниже, который не разрешается. 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 
                }
        });                

             }
        });
    });
};
  • 0
    конкатенация строк с помощью bool? также где fun1?
  • 0
    Я не понимаю, что это значит извините - я новичок в этом!
Показать ещё 5 комментариев
Теги:
promise
resolve

2 ответа

0
Лучший ответ

findId требует return new Promise((resolve,reject) => { }); обернутый вокруг него.

И затем вы можете вызвать editId в findId и заменить callback(result) с помощью resolve(editId(context, result));

После этого замените var find в fun1 на var find = findId (a, id) и удалите требование обратного вызова от findId

2

Дело здесь в том, чтобы сделать ваш код последовательным.

Я думаю, вы должны перенести все свои функции обратного вызова в 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");
  }
}

Надеюсь это поможет.

  • 0
    Если вы не хотите спагетти, используйте async и ждите.
  • 0
    Я думаю, что оба асинхронные, ожидают или обещают - все в порядке. Суть в том, чтобы придерживаться только одной вещи. Я объяснил выше. Если у него есть идея использовать обещание, следует сделать все обещание, чтобы он мог легко отлаживать и читать код.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню