javascript - 如何在 promise 之间等待

标签 javascript node.js promise bluebird

我有一个在执行之前返回的命令,所以我想在遵循 promise 链之前稍等片刻。这样做有什么最佳做法吗?

 new Promise(function (resolve, reject) {
      exec('netbeast new test-app', function (err, stdout, stderr) {
        if (err) return reject(err)
        else return resolve(PATH_TO_APP)
      })
    })
    .then(fs.readdirAsync)
    .then(fs.readFileAsync.bind(fs, PATH_TO_APP + '/server.js'))
    .then(function (data) {
      var shebang = data.toString().slice(0, data.toString().indexOf('\n'))
      shebang.should.equal('#!/usr/bin/env node')
      return Promise.resolve()
    })
    .then(fs.readJsonAsync.bind(fs, PATH_TO_APP + '/package.json'))
    .then(function (data) {
      return fs.accessAsync(PATH_TO_APP + '/' + data.main, fs.X_OK)
    })
    .then(done)

最佳答案

I have a command that returns before fulfilling

如果该操作与您可以监控并知道何时完成的 promise 无关,这听起来像是一个设计错误。您应该修复您的操作,以便在异步操作实际完成之前它不会完成。您没有确切解释您的问题出在哪里,但如果您这样做了,我们可能会帮助您解决真正的问题,而不是拖延时间。

如果这是多个 promise 之间的协调问题,那么您可能只需要确保各种异步操作适本地链接在一起,以便等待前一个操作,或者通过从 .then() 中返回一个 promise 处理程序,从允许调用者等待完成的函数返回一个 promise ,或者适本地将操作与连续的 .then() 处理程序链接起来。


如果您确实需要插入延迟,看起来您正在使用包含内置延迟机制的 Bluebird。在给定的 promise p 上,您可以使用 .delay(n) 方法:

p.delay(100).then(...)   // wait 100ms before allowing promise chain to proceed

或者,在 .then() 处理程序中,您可以返回 Promise.delay(n),如下所示:

p.then(function(data) {
   ...
   return Promise.delay(100);  // wait 100ms before allowing promise chain to proceed
})

关于javascript - 如何在 promise 之间等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593833/

相关文章:

javascript - 一次 :true with addEventListener doesn't work on IE11 or Edge

node.js - 当我尝试在 Jade 中显示 SQL 查询结果时获取 [object Object]

javascript - 如何在知道确切的 'th' 文本的情况下获取正确的元素

node.js - 如何在 node.js 中使用 ES6 模块?

javascript - 第一次运行时网站运行速度变慢?

node.js - api 服务器 Node 中的多个 Promise 返回 null

javascript - 将 promise 转换为异步/等待 - Javascript

javascript - jQuery Deferred 对象,按顺序调用函数

javascript - 删除 Javascript 警报行会阻止我的 append 代码正常工作

JavaScript + 扩展脚本 |从变量中检索文件夹路径并在其中创建一个新文件夹