很难理解如何从承诺链中将值返回给父函数

时间:2019-03-17 05:39:35

标签: javascript asynchronous promise

我从对主题的了解极少的角度提出这个问题,并且我试图弄清并理解正在发生的事情。

我通读了How do I return the response from an asynchronous call?上的文章,但我听不懂。

但是,根据我的阅读,看来标题为“ 如果您在代码中未使用jQuery,此答案适合您”的部分就是处理该结构的部分我在用。但是,由于示例中引用的资料与我的资料有很大不同,因此我根本无法充分理解或理解它,从而无法将其有效地应用于我的代码。

我还阅读了很多其他有关从诺言链返回值的文章,但是由于我在异步JavaScript和诺言方面处于初学者水平,因此我无法完全理解或理解它们。

我希望有人能够以最简单的方式进行解释,并帮助我理解如何应用标题为“ 如果您的代码中未使用jQuery的内容”中的内容,”从How do I return the response from an asynchronous call?到我的代码。

我有一个函数,并且函数内部有一个异步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;
  }
};

我有一个名为PromiseResult的变量设置为异步代码。

我试图理解如何根据代码中显示的if / else逻辑将特定值设置为PromiseResult。

最终,将调用 LF('save','thekey','value'),我需要返回“ something”值为true或false的内容。

我希望有人能解释我如何更改此代码以实现我需要做的事情,并以非常简单的伪造方式进行解释,以便我能真正理解正在发生的事情。

我认为在.then内设置“ thePromiseResult = 1”可能不是全局设置,而只是在.then内设置所需的值。

我试图查看有关该主题的其他文章,但我无法使用它们显示的各种示例来掌握这些概念。

我的目标是在另一页上显示代码

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

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

我正在尝试分解代码,以使其反映 2下的工作。重组代码,其中讨论了让您的函数接受回调。但是,由于该示例中使用的代码与我所使用的代码有很大不同,所以我只是不够了解,无法理解所描述的内容。

我希望有人可以采用幼儿园编码器的方法来帮助我翻译概念,以便更清楚地将其应用于我的代码。

1 个答案:

答案 0 :(得分:0)

如果我理解您的问题,似乎您正在尝试使诺言返回不承诺的结果。假设:

// 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)
  })