【问题标题】:Passing value into next Promises argument将值传递给下一个 Promises 参数
【发布时间】:2018-04-06 12:05:58
【问题描述】:

基本上,我对 Promise 感到很困惑。因为,我还是个新手,不知道如何从 Callback 方法处理异步。

所以,我有这样的代码

const Search = function(name) { //
  return new Promise((resolve, reject) => { //
    let o = [{
        "name": "Apple",
        "quantity": 10
      },
      {
        "name": "Grape",
        "quantity": 5
      }
    ]
    let result = o.filter((n) => n.name == name)
    if (result.length < 1) {
      reject()
      return
    }
    resolve(result[0])
  })
}

const Buy = function(data, qty) {
  return new Promise((resolve, reject) => {
    let o = {
      name,
      quantity
    } = data
    o.quantity = parseInt(o.quantity) - qty
    if (o.quantity < 0) {
      throw new Error("Oops. Quantity is Empty!")
    }
    resolve(o)
  })
}

const Result = function(test) {
  console.log(test)
}

主要目的,我如何在 Buy 函数的 qty 参数中输入一个值?

我正在做这样的事情,但结果不是我想要的。我敢肯定,我的代码缺少一些东西,但我不知道。

Search("Apple")
  .then(Buy, 4)
  .then(Result)

结果是:

{ name: 'Apple', quantity: NaN }

主要目标是:

{ name: 'Apple', quantity: 6 }

无论如何谢谢:)

【问题讨论】:

标签: javascript asynchronous promise


【解决方案1】:

then 方法接受一个函数,因此您可以将“购买”更改为以下内容:

const Buy = function(qty) {
  return function(data){
    return new Promise((resolve, reject) => {
      let o = {
        name,
        quantity
      } = data
      o.quantity = parseInt(o.quantity) - qty
      if (o.quantity < 0) {
        throw new Error("Oops. Quantity is Empty!")
      }
      resolve(o)
    })
  }
}

然后你可以像这样使用它:

Search("Apple")
  .then(Buy(4))
  .then(Result)

【讨论】:

  • 我实际上也想到了这个解决方案——返回一个函数,几乎就像一个“咖喱”函数的情况。唯一的缺点是,对我来说,当你有这样的函数返回函数时,逻辑有点难以理解。
【解决方案2】:
Search("Apple")
  .then(function(result){return Buy(result, 4)})
  .then(Result)

您试图将Buy 直接传递给.then,但.then 中的函数总是只传递一个参数。因此,您可以在匿名函数中调用并返回 Buy,您可以在其中应用任意数量的参数。

【讨论】:

  • 啊,我明白了。那么,then 本身只有 1 个参数,所以我们需要修改 then 函数并手动返回到另一个函数中?
  • 是的。 this documentation 谈到了 'onFulfilled' 参数,“如果 Promise 被履行,则调用一个函数。这个函数有一个参数,即履行值。”,它是从 promise 解析的值。
【解决方案3】:

您可以利用范围。

function executeSearch() {
    Search("Apple").then(function (searchResult) {

        // feel free to use the result of the first promise 
        // as input parameters to the second if desired
        const name = searchResult.name;
        const quantity = searchResult.quantity;

        Buy(searchResult, 4).then(Result);

    });
}

这与另一个答案类似,但表明您可以通过多种方式使用第一个承诺的结果来执行第二个承诺。

【讨论】:

  • const { name, quantity } = searchResult; 是干什么用的?
  • @Satpal 这只是一个演示,表明您可以在该上下文中访问这些变量,如果需要,您可以将它们用作输入参数。
猜你喜欢
  • 2018-03-03
  • 2015-12-30
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多