使用 bluebird 和 coffeescript 的简单 promise 示例在一半时间内有效

Posted

技术标签:

【中文标题】使用 bluebird 和 coffeescript 的简单 promise 示例在一半时间内有效【英文标题】:Simple promise example with bluebird and coffeescript works half the time 【发布时间】:2015-09-12 20:27:56 【问题描述】:

所以我基本上是在尝试使用 Promise 编写一些简单的代码,但我很难理解为什么这个特定的代码每隔一段时间就可以工作。

Promise = require('bluebird')
mkdirp = Promise.promisify(require('mkdirp'))
rm = Promise.promisify(require('rimraf'))

console.log "Preparing build directory"
rm('build')
  .then(mkdirp('build'))

这将成功完成第一次运行,但第二次将失败,依此类推。

步骤如下:

┌[adam@bigboi] [/dev/pts/5] [master ⚡] 
└[~/Projects/bummyjab]> time coffee index.coffee ~/Dropbox/Articles/*.md
Preparing build directory
coffee index.coffee ~/Dropbox/Articles/*.md  0.25s user 0.02s system 100% cpu 0.267 total
┌[adam@bigboi] [/dev/pts/5] [master ⚡] 
└[~/Projects/bummyjab]> stat build
  File: ‘build’
  Size: 4096       Blocks: 8          IO Block: 4096   directory
Device: 804h/2052d Inode: 17172395    Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/    adam)   Gid: ( 1000/    adam)
Access: 2015-06-25 22:07:49.061331341 -0400
Modify: 2015-06-25 22:07:49.061331341 -0400
Change: 2015-06-25 22:07:49.061331341 -0400
 Birth: -
┌[adam@bigboi] [/dev/pts/5] [master ⚡] 
└[~/Projects/bummyjab]> time coffee index.coffee ~/Dropbox/Articles/*.md
Preparing build directory
Unhandled rejection Error: EEXIST: file already exists, mkdir '/home/adam/Projects/bummyjab/build'
  at Error (native)

coffee index.coffee ~/Dropbox/Articles/*.md  0.20s user 0.03s system 100% cpu 0.235 total

不幸的是,我在这方面的谷歌技能还没有找到发生这种情况的原因。

谢谢

【问题讨论】:

查看pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html.then 需要一个函数。相反,您会立即调用一个函数,并将其返回值传递给.then。 @jfriend00 向您展示了下面的正确方法。 请注意,在 Bluebird 3.0 中,promise 库会自行告诉您问题所在:) 【参考方案1】:

如果您试图控制顺序以使 mkdirp('build') 仅在 rm('build') 完成后发生,那么您需要将函数引用传递给 .then(),如下所示:

rm('build').then(function () 
    return mkdirp('build');
);

或者,您可以使用.bind()

rm('build').then(mkdirp.bind(null, 'build'));

您所做的是立即执行mkdirp() 并将返回值传递给.then(),它不会等到promise 得到解决才执行它。

【讨论】:

以上是关于使用 bluebird 和 coffeescript 的简单 promise 示例在一半时间内有效的主要内容,如果未能解决你的问题,请参考以下文章

使用 bluebird 和 coffeescript 的简单 promise 示例在一半时间内有效

如何使用 Bluebird 为游标和/或集合的 toArray() Promisify Node 的 mongodb 模块?

与 fs 和 bluebird 的承诺

使用 Mongoose FindOne 和 Bluebird Promises 在循环中构建数组

NPM CI 和 Bluebird 承诺警告

bluebird