将值传递到下一个Promises参数

时间:2017-10-25 11:53:25

标签: javascript asynchronous promise

基本上,我对Promises很困惑。因为,我仍然是从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 }

无论如何,谢谢:)

3 个答案:

答案 0 :(得分:3)

Search("Apple")
  .then(function(result){return Buy(result, 4)})
  .then(Result)

您试图将Buy直接传递给.then,但.then中的函数始终只传递1个参数。所以你可以在一个匿名函数中调用并返回Buy,在那里你可以自己应用你想要的参数。

答案 1 :(得分:2)

您可以利用范围。

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);

    });
}

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

答案 2 :(得分:2)

then方法接受一项功能,因此你可以做的就是更改你的购买&#39;以下内容:

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)