将值传递给下一个 Promises 参数

Posted

技术标签:

【中文标题】将值传递给下一个 Promises 参数【英文标题】:Passing value into next Promises argument 【发布时间】: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 

无论如何谢谢:)

【问题讨论】:

How to pass parameter to a promise function的可能重复 【参考方案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 这只是一个演示,表明您可以在该上下文中访问这些变量,如果需要,您可以将它们用作输入参数。

以上是关于将值传递给下一个 Promises 参数的主要内容,如果未能解决你的问题,请参考以下文章

将值传递给函数的参数无法正常工作

将可变参数模板参数包传递给下一个函数

如何通过 Dart 中的 onTap 函数将值传递到另一个屏幕?

将值直接作为数组传递给C [重复]

将存储在 IBAction 中的值传递给下一个 Nib UITextField。

如何使用java将值动态传递给sp?