如何在承诺之间等待

时间:2016-06-02 13:50:49

标签: 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)

3 个答案:

答案 0 :(得分:4)

  

我有一个在完成

之前返回的命令

如果该操作与您可以监控并知道何时完成的承诺相关联,那听起来就像是设计错误。您应该修复您的操作,以便在实际执行异步操作之前它不会满足。你没有准确解释你的问题在哪里,但如果你这样做,我们可能会帮助你解决真正的问题,而不是延迟黑客。

如果它是多个promises之间的协调问题,那么你可能只需要确保各种异步操作被适当地链接在一起,这样就可以通过从{{1}内返回一个promise来等待前一个处理程序,从函数返回一个promise,允许调用者等待完成或用连续的.then()处理程序适当地链接操作。

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

.delay(n)

或者,在p.delay(100).then(...) // wait 100ms before allowing promise chain to proceed 处理程序中,您可以返回.then(),如下所示:

Promise.delay(n)

答案 1 :(得分:3)

它可能在某些用例中非常有用,在这些用例中,在开始另一个操作之前等待一点是方便的。我认为最简单的方法是:

.then(function() {
    return new Promise(function (resolve) {
         setTimeout(resolve, TIME_TO_WAIT_IN_ms)
    })
})

编辑:我认为没有"最佳做法"为了这。如上所述,等待在异步编程中没有考虑。但是我认为它可以用于边缘情况,根据需要,需要一种解决方法。

编辑2 :如下所述,bluebird(一个承诺库)有内置的快捷方式。对于承诺p.delay(TIME_IN_ms).then(...)p.then(() => return Promise.delay(TIME_IN_ms))

答案 2 :(得分:0)

只有在您致电vi{then后,承诺才会调用reject中的代码。如果它不像那样,那就是一个大问题。

如果您想延迟承诺的解决方案,可以延迟拒绝或解决的呼叫:

resolve

我删除了回调中的 exec('netbeast new test-app', function (err, stdout, stderr) { setTimeout( () => { if (err) reject(err); else resolve(PATH_TO_APP); }, 100); }) ,因为我不明白为什么。