我有一个在完成之前返回的命令,所以我想在遵循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)
答案 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);
})
,因为我不明白为什么。