Сложно понять, как вернуть значение в родительскую функцию из цепочки обещаний - PullRequest
0 голосов
/ 17 марта 2019

Я подхожу к этому вопросу с точки зрения минимального понимания предмета и пытаюсь понять и понять, что происходит.

Я прочитал статью на Как я могу вернуть ответ от асинхронного вызова? , но я не могу понять это.

Однако, исходя из моего прочтения, может показаться, что раздел, озаглавленный " Если вы не используете jQuery в своем коде, этот ответ для вас " - это раздел, который касаетсяструктура, которую я использую.Однако, поскольку материал, на который есть ссылки в примере, сильно отличается от моего, я просто не могу следовать или понять его настолько, чтобы иметь возможность эффективно применять его в своем коде.

Я также прочитал много других статей о возврате значений из цепочек обещаний, но я не могу полностью следовать или понимать их либо из-за моего статуса на уровне до начала обучения с точки зрения асинхронного javascript и обещаний.

Я надеюсь, что кто-то сможет объяснить самыми простыми способами и помочь мне понять, как применять материал в разделе, озаглавленном " Если вы не используете jQuery в своем коде, этот ответ для вас "из Как вернуть ответ от асинхронного вызова? в мой код.

У меня есть функция, и внутри функции есть асинхронный фрагмент JavaScript.

Я обновил свой код до этого:

function LF(action, key, value){
  var ectcb = localforage.createInstance({name: "ectcb"});
    return ectcb.defineDriver(window.cordovaSQLiteDriver).then(function() {
    return ectcb.setDriver([
    window.cordovaSQLiteDriver._driver,
    ectcb.INDEXEDDB,
    ectcb.WEBSQL,
    ectcb.LOCALSTORAGE
    ]);
      }).then(function() {
        if (ectcb.driver().toString() = 'cordovaSQLiteDriver'){
          if (action = 'save'){ectcb.setItem(key, value); return true;} 
          else if (action = 'load'){ectcb.getItem(key, value); return true;}
          else {return false;}
          }
        else {return false;}
      }).catch(function(err) {
        return false;     
      });
    };

Первоначально код был прямо ниже

function LF(action, key, value) {
  var ectcb = localforage.createInstance({
    name: "ectcb"
  });
  var thePromiseResult = ectcb.defineDriver(window.cordovaSQLiteDriver).then(function() {
    return ectcb.setDriver([
      window.cordovaSQLiteDriver._driver,
      ectcb.INDEXEDDB,
      ectcb.WEBSQL,
      ectcb.LOCALSTORAGE
    ]);
  }).then(function() {
    if (ectcb.driver().toString() = 'cordovaSQLiteDriver') {
      if (action = 'save') {
        return ectcb.setItem(key, value);
      } else if (action = 'load') {
        return ectcb.getItem(key, value);
      } else {
        thePromiseResult = 1;
      }
    } else {
      thePromiseResult = 1;
    }
  }).catch(function(err) {});

  if (thePromiseResult = 1) {
    return false;
  } else {
    return true;
  }
};

У меня есть переменная с именем thePromiseResult, установленная в асинхронный код.

Я пытаюсь понять, как я могу задать конкретное значение для thePromiseResultна основе логики if / else, показанной в коде.

В конечном счете, что-то будет вызывать LF ('save', 'thekey', 'value') , и мне нужно вернуть этому "чему-то" значение true или false.

Я надеюсь, что кто-то сможет объяснить, как я могу изменить этот код, чтобы добиться того, что мне нужно сделать, и объяснить это очень простым для чайников способом, чтобы я мог по-настоящему понять, что происходит.

Я думаю, что установка «thePromiseResult = 1» внутри .then, вероятно, не устанавливает его глобально, а просто устанавливает внутри .then желаемое значение.

Я попытался посмотреть другие посты на эту тему, и я не могу понять концепции, используя различные примеры, которые они показывают.

Моя цель - разместить на другой странице код с надписью

var result = LF('fake','myKey','myValue')

if (result = false){alert("Operation Failed");
else if (result = true){alert("Operation Successful");  

Я пытаюсь разбить код так, чтобы он отражал то, что делается в 2.Перестройте код , где говорится, что ваша функция может принять обратный вызов.Однако, поскольку код, используемый в этом примере, сильно отличается от того, что у меня есть, я просто недостаточно осведомлен, чтобы следовать описанному.

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

1 Ответ

0 голосов
/ 17 марта 2019

Если я понимаю ваш вопрос, кажется, что вы пытаетесь заставить свое обещание вернуть результат без обещаний. Допустим,

// you want "result" to be 2 here
var result = somePromise
  .then(asyncTwo => asyncTwo) // lets say the promise resolved with 2

result // still a promise, but you want it to be 2

Это неправильное понимание того, как и почему используются обещания. При работе с асинхронным кодом обратные вызовы всегда разрешают после выполнения вашего синхронного кода. Это означает, что result никогда не может быть установлено на 2 там, где вы хотите.

Это может помочь суть вопроса:

console.log('synchronous code start')
var result

var somePromise = new Promise((resolve) => {
  setTimeout(() => {
    resolve(2)
  }, 0)
})

somePromise.then(asyncTwo => {
  console.log('somePromise resolves with 2')
  result = asyncTwo // set result to two
})

console.log('this code is synchronous so result still equals ', result)

setTimeout(() => {
  console.log('sometime later result may equal ', result)
  console.log('but your synchronous code has already finished so this is unhelpful!') 
}, 500)

console.log('synchronous code finished')

Ответ заключается в том, чтобы принять шаблон Promise, чтобы вы могли работать с асинхронным кодом логическим способом. Вместо того, чтобы пытаться поднять ваш асинхронный результат в синхронный код (что, кстати, невозможно), добавьте цепочку then / catch, чтобы применить дополнительную логику к асинхронному результату.

// lets mock out an example of what you might get:

function asyncOneOrTwo () {
  // one or two randomly
  let oneOrTwo = Math.floor(Math.random() * 2) + 1
  return Promise.resolve(oneOrTwo)
}

function LF () {
  return asyncOneOrTwo()
    .then(oneOrTwo => {
      // you can reject with an error message instead if that's your preference
      if (oneOrTwo === 1) return Promise.reject(oneOrTwo)
      else return Promise.resolve(oneOrTwo)
    })
}

// in another file
// chain `then` or `catch` to do additional error handling
LF()
  .then(res => {
    console.log('success we got: ', res)
  })
  .catch(err => {
    console.log('fail we got: ', err)
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...