Обещать внутри обещание: какой правильный способ вернуть переменную от ребенка обещают? (ДС)

У меня есть такая функция:

function top() {

  //promise1
  ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;

        });

});

};

и мне нужно вернуть результат таким образом:

var myresult = start();

Как я могу это сделать? спасибо

Ответ 1

Определение promises заключается в том, что вы не можете буквально назначить result myresult. Однако вы можете сделать myresult обещание, которое разрешается непосредственно для result для вызывающего, однако для этого было использовано много promises. Основная идея заключается в том, что внутри каждой функции в вашем предыдущем блоке вы должны быть return следующего Promise в цепочке. например:

function top() {

  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        return ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;
         return result;

        });

});

};

В конце концов, код, вызывающий top(), не знает или не заботится о том, чтобы 1, 2 или 12 прикованных promises были использованы для получения result. Он также сможет зарегистрировать обратный вызов ошибки в случае отказа любого из этих promises.

Ответ 2

Не совсем уверен, что это будет работать с родным JS promises, но в PromiseKit (swift.. я знаю, но я уверен, что это должно работать). Я привык возвращать второе обещание и цепью это так:

function top() {
  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {
    //promise2
    return ChildPromise({
          ..some code here...
    })
  }).then(function(response) {
    var result = response.result.items;

  });
}

top().then(function(){
  // all done 
});

Ответ 3

Проблема заключается в том, что вы пытаетесь использовать асинхронный код синхронно. Вам нужно будет изменить то, как вы думаете при работе с асинхронным кодом.

Один из способов решения этого вопроса - вернуть() return ParentPromise, а затем установить переменную myresult с помощью .then() возврата этого обещания.

function top() {
  ...
  return ParentPromie;
}
var myresult = ''; // default value until you have resolved your promise
top().then(result => myresult = result);

Однако для этого вам нужно будет добавить код, чтобы решить ваше обещание:

var ParentPromise = new Promise(function(resolve) { 
  ... some code...
  var ChildPromise = new Promise(function(){
    ...some code...
  }).then(function(response){
    resolve(response.result.items);
  });
});