Как вернуть обещание из функции, которая сама использует обещание?

#javascript #node.js #promise

#javascript #node.js #обещание

Вопрос:

То, что я пытаюсь сделать, в основном

 function test() {
getSomeValue().then(function (data) {
    //process data
});
}

function getSomeValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}

function getSomeOtherValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}
  

Функциональный тест вызывает функцию, которая возвращает обещание, а затем выполняет некоторые вычисления над возвращенными данными. Эта часть работает нормально. Теперь функции getSomeValue необходимо вызвать другую функцию, которая также возвращает обещание. Как мне вернуть обещание, getSomeValue которое также ожидает getSomeOtherValue завершения.

Дайте мне знать, если потребуется какая-либо другая информация.

Комментарии:

1. Вы можете выполнить цепочку, .then().then()....

Ответ №1:

чтобы получить значение из getSomeOtherValue перед getSomeValue, просто сначала вызовите функцию getSomeOtherValue , затем соединитесь с другой функцией для обработки значения для getSomeValue, затем, наконец, верните результат вызывающему (тестовая функция)

 function getSomeValue() {
  //do some long process 
  return getSomeOtherValue().then(function(resultFromSomeOtherValue) {
    return new Promise(function (resolve, reject) {
      var result = true; //some value after process;
      return resolve(result);
    });
  });
}
  

Комментарии:

1. добавлено объяснение

Ответ №2:

Вы можете просто связать getSomeOtherValue внутри getSomeValue :

 function getSomeValue() {
    //do some long process 
    return new Promise(function (resolve, reject) {
        resolve(result);
    }).then(getSomeOtherValue);
}
  

Если вы хотите, чтобы порядок был изменен, тогда:

 function getSomeValue() {
    //do some long process 
    return getSomeOtherValue().then(function () {
        return new Promise(function (resolve, reject) {
            resolve(result);
        });        
    }
}
  

Однако это только для иллюстрации. Вы можете разработать свои обещания так, чтобы вы могли эффективно связывать их на более высоком уровне:

 function test() {
    getSomeOtherValue()
        .then(getSomeValue)
        .then(function (data) {
            //process data
        });
}
  

Комментарии:

1. на самом деле getSomeOtherValue() должен быть вызван раньше. Мне нужны данные из getSomeOtherValue(), а затем сгенерировать ответ на основе этого

Ответ №3:

Чтобы дождаться getSomeOtherValue разрешения функции, вам необходимо разрешить обещание getSomeValue функции в возвращаемом обещании из getSomeOtherValue функции. Надеюсь, приведенный ниже код должен иметь смысл

 function test() {
getSomeValue().then(function (data) {
    //process data
});
}

function getSomeValue() {
//do some long process 
return new Promise(function (resolve, reject) {
  getSomeOtherValue().then(function (data) {
      resolve(result);
  });        
});
}

function getSomeOtherValue() {
//do some long process 
return new Promise(function (resolve, reject) {
    resolve(result);
});
}