gpt4 book ai didi

javascript - 我如何链接多个 promise ?

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:00 26 4
gpt4 key购买 nike

我不太确定,也许我遗漏了一些明显的东西,但我不知道如何链接两个 promise 。

我的基于回调的代码看起来像这样:

async.series([
function (cb) {
// Create the directory if the nodir switch isn't on
if (!nodir) {
fs.mkdir('somedirectory', function (err) {
if (err) {
log('error while trying to create the directory:\n\t %s', err)
process.exit(0)
}
log('successfully created directory at %s/somedirectory', process.cwd())
cb(null)
})
}
cb(null)
},
function (cb) {
// Get the contents of the sample YML
fs.readFile(path.dirname(__dirname) + '/util/sample_config.yml', function (err, c) {
var sampleContent = c
if (err) {
log('error while reading the sample file:\n\t %s', err)
process.exit(0)
}
log('pulled sample content...')
// Write the config file
fs.writeFile('db/config.yml', sampleContent, function (err) {
if (err) {
log('error writing config file:\n\t %s', err)
process.exit(0)
}
log('successfully wrote file to %s/db/config.yml', process.cwd())
cb(null)
})
})
}
])

我已经开始尝试将其重构为基于 promise 的流程,这是我目前所拥有的:

if (!nodir) {
fs.mkdirAsync('somedirectory').then(function () {
log('successfully created directory at %s/somedirectory', process.cwd())
}).then(function () {
// how can I put fs.readFileAsync here? where does it fit?
}).catch(function (err) {
log('error while trying to create the directory:\n\t %s', err)
process.exit(0)
})
}

(我用的是Bluebird,所以我之前做了Promise.promisifyAll(fs))

问题是,我不知道把上一个系列的第二个“步骤”放在哪里。我是将它放在 then 中还是放在它的函数中?我是否返回它并将其放在一个单独的函数中?

如有任何帮助,我们将不胜感激。

最佳答案

通常 promise 驱动的代码如下所示:

operation.then(function(result) {
return nextOperation();
}).then(function(nextResult) {
return finalOperation();
}).then(function(finalResult) {
})

您的示例中发生了很多事情,但总体思路如下:

Promise.resolve().then(function() {
if (nodir) {
return fs.mkdir('somedirectory').catch(function(err) {
log('error while trying to create the directory:\n\t %s', err);
process.exit(0);
});
}
}).then(function() {
return fs.readFile(path.dirname(__dirname) + '/util/sample_config.yml').catch(function(err) {
log('error while reading the sample file:\n\t %s', err);
process.exit(0);
})
}).then(function(sampleContent) {
log('pulled sample content...');

return fs.writeFile('db/config.yml', sampleContent).catch(function(err) {
log('error writing config file:\n\t %s', err)
process.exit(0)
})
}).then(function() {
log('successfully wrote file to %s/db/config.yml', process.cwd())
})

这假定您正在使用的所有调用都是 promise native。

原始的 Promise.resolve() 只是以 promise 开始链的东西,因为您的第一步是有条件的。

关于javascript - 我如何链接多个 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com