Как передать переменные через цепочку обещаний - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно передать переменную через цепочку обещаний .then. Я не могу найти способ решить это. Я новичок в этом, так что терпите меня!

return foo.bar(baz)
         .then((firstResult) => {
           let message = firstResult;
         })
         .then(() => foo.bar(qux)
           .then((secondResult) => {
             message =+ secondResult;
             console.log(message);
           })
         )

Как правильно это сделать, пожалуйста?

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Вам нужно позвонить foo.bar(qux) только после того, как foo.bar(baz) завершено.

Вот как вы вызываете асинхронную функцию внутри другой:

return foo.bar(baz).then((firstResult) => {
    let message = firstResult;
    // do some operation with firstResult
    foo.bar(qux).then((secondResult) => {
      message =+ secondResult;
      console.log(message);
    });
});                       

Лучший подход : Вы можете создать массив promise, а затем использовать его, используя Promise.all() следующим образом:

var promises = [
    foo.bar(baz),
    foo.bar(qux)
];

Promise.all(promises.map(p => p.catch(error => null))).then( results => {
    let firstResult = results[0]
    let secondResult = results[1];
    console.log("firstResult -->", firstResult);
    console.log("secondResult -->", secondResult );
});                               
0 голосов
/ 05 июля 2018

Просто сделайте одну цепочку обратным вызовом другой:

 return foo.bar(baz).then((firstResult) => {
    let message = firstResult; 
    return foo.bar(qux).then((secondResult) => {
       message =+ secondResult;
       console.log(message);
       return message;
    });
});
0 голосов
/ 05 июля 2018

Я объясню, почему ваш код не работал.

Область действия переменной 'let' остается в скобках, которые вы указали. Таким образом, в следующем .then() эта переменная сообщения утратила свою область видимости, и вы не смогли заставить ее работать.

Прочитайте документы здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

Чтобы решить вашу проблему, вы можете объявить переменную вне цепочки обещаний и написать ее так:

let message; // Declare it outside so that the variable is in scope throughout the promise chain

return foo
  .bar(baz)
  .then((firstResult) => {
    message = firstResult; // Set the value here
  })
  .then(() => foo
    .bar(qux)
    .then((secondResult) => {
      message += secondResult;
      console.log(message);
    }));

См. Следующий рабочий пример: https://jsfiddle.net/sivcan/h3pguw4e/

0 голосов
/ 05 июля 2018

Не используйте для этого цепочку обещаний.

Вы делаете два независимых вызова на foo.bar(), и ни один из них не зависит от результатов другого.

Сделайте их самостоятельно, и в конце получите все свои данные с Promise.all.

var promises = [
    foo.bar(baz),
    foo.bar(qux)
];
Promise.all(promises).then( results => {
    let message = results[0] + results[1];
    console.log(message);
});
...