当前位置: 首页 > 面试题库 >

承诺只开一次枪?

颜德馨
2023-03-14
问题内容

有什么理由使下面的承诺仅触发一次?

console.log('start')

var Promise = require('bluebird')
var onoff = require('onoff')
var Gpio = onoff.Gpio
var button = new Gpio(4, 'in', 'both')

var buttonWatchAsync = function (button, desiredValue) {
  return new Promise (function (resolve, reject) {
    return button.watch(function(err, value) {
      if (err) return reject(err)
      if (typeof desiredValue === 'undefined') return resolve(value)
      if (desiredValue === value) return resolve()
    })
  })
}

buttonWatchAsync(button)
  .then(function (value) {
    console.log('fired promise')
    console.log(value)
  })
  .catch(function (err) {
    throw err
  })

问题答案:

因为诺言只能发射一次。创建/初始化诺言,然后进行结算,一旦结算,便永远无法取消或重新结算。打电话resolvereject第二次(第三,第四,…)时间是无人值守。(有些人认为应该是一个错误,但不是。)承诺不是事件,它们不能重复发生。因此,对于该代码在做什么,承诺不是正确的工具。



 类似资料:
  • 问题内容: 我已经开发JavaScript几年了,我完全不了解关于promise的麻烦。 看来我所做的就是改变: 无论如何我都可以使用像async这样的库,它有类似以下内容: 哪个代码更多,可读性更差。我在这里什么都没得到,也不是突然变得神奇地“平坦”。更不用说必须将事情变成诺言。 那么,这里的诺言有什么大惊小怪的呢? 问题答案: 承诺不是回调。许诺代表 异步操作 的 未来结果 。当然,以您的方式

  • 问题内容: 我对诺言不太熟悉。我想从承诺电话中隐藏承诺的实现。 例: 然后我将在同一文件中而不是在同一函数中解决我的诺言,我称其为诺言。 现在,我知道“ promiseFriend”是不确定的。我如何才能将承诺电话与承诺解决方案区分开? 问题答案: 如果要在函数中定义一个promise并在其他地方使用它,则首先需要从该函数返回promise,而您在代码中没有这样做。然后,您需要实际调用您也没有执行

  • 问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困

  • 问题内容: 我要兑现一个承诺。关键是我真的想在第一个诺言兑现后立即访问(仍在等待中的)第二个 诺言 。不幸的是,当两个诺言都实现时,我似乎只能获得第二个诺言的解决值。 这是我想到的用例: 该功能显示文件选择器,用户可以在其中从自己的硬盘驱动器或URL中选择文件。它返回一个承诺,该承诺将在用户选择文件后立即兑现。此时,我们可能仍然必须通过网络下载所选文件。因此,我不能将所选文件作为分辨率值。相反,应

  • 问题内容: 我有一个整数id的数组,例如 并且我需要为每个ID执行异步远程调用。每个调用都是一个使用$ resource执行的WebAPI请求,并显示为Promise。 我需要创建一个接受这些ID数组的函数,然后初始化递归承诺链。该链应导致对每个ID依次进行webapi调用。这些调用不应并行,而应链接在一起。 有问题的函数返回自己一个“主要”的承诺,该承诺应根据异步Web调用的结果来解决或拒绝。也

  • 问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您