gpt4 book ai didi

node.js - 复杂的 Promise 序列 - 嵌套

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:55 24 4
gpt4 key购买 nike

经过大量谷歌搜索后,我无法确认解决此问题的正确方法。以下代码按预期运行,但我有一种严重的感觉,我没有以正确的方式处理这个问题,并且我正在为自己设置问题。

以下代码由主 app.js 文件启动,并传递一个位置以开始从 mongoDB 加载 XML 文件并在其中进行处理

exports.processProfiles = function(path) {

var deferrer = q.defer();

q(dataService.deleteProfiles()) // simple mongodb call to empty the Profiles collection
.then(function(deleteResult) {
return loadFilenames(path); // method to load all filenames in the given path using fs
})
.then(function(filenames) {
// now we have all the file names lets load and save
filenames.forEach(function(filename) {

// Here is where i think the problem is!
// kick off another promise chain for the dynamically sized array of files to process
q(loadFileContent(path, filename)) // first we load the data in the file
.then(function(inboundFile) {
// then parse XML structure to my new shiny JSON structure
// and ask Mongo to store it for me
return dataService.createProfile(processProfileXML(filename, inboundFile));
})
.done(function(result) {
console.log(result);
})
});
})
.catch(function(err) {
deferrer.reject('Unable to Process Profile records : ' + err);
})
.done(function() {
deferrer.resolve('Profile Processing Completed');
});

return deferrer.promise;
}

虽然这段代码可以工作,但这些是我主要关心的问题,但经过几个小时的谷歌和阅读后我无法自己解决它们。

1) 这会阻塞吗?如果它按照我想要的方式异步运行,则很难理解控制台的读数 - 我认为是这样,但如果我做了一些根本错误的事情,建议会很好

2)嵌套 promise 是一个坏主意,我应该将其链接到外部 promise - 我已经尝试过,但无法编译或运行任何内容。

最佳答案

我已经很长时间没有使用 Q 了,但我认为您需要做的就是让它知道您将要交还一系列 promise ,这些 promise 在继续之前都需要得到满足。

此外,当您在一段代码上等待多个 promise 时,不要进一步嵌套,而是在全部满足后将“一组” promise 重新抛出。

q(dataService.deleteProfiles())  // simple mongodb call to empty the Profiles collection
.then(function (deleteResult) {
return loadFilenames(path); // method to load all filenames in the given path using fs
})
.then(function (filenames) {
return q.all(
filenames.map(function (filename) {
return q(loadFileContent(path, filename)) { /* Do stuff with your filenames */ });
})
);
.then(function (resultsOfLoadFileContentsPromises) {
console.log('I did stuff with all the things');
)
.catch(function(err) {});

你所拥有的并不是“阻塞”。但实际上,您对 Promise 所做的是将事情移至新的“阻塞”部分。您拥有的 block 越多,您的代码就会显得越异步。如果除了这个 promise 之外没有其他任何事情发生,它仍然会显得是程序性的。

但是内部 promise 仍然必须在父 promise 解决之前解决。

像你所拥有的那样的内部 promise 本质上并不是坏事,我个人会将它们分解成单独的文件,以便更容易推理,但我不会将其定义为“坏”,除非不需要存在内部 promise ,但是在可能的情况下(在您的示例中)我已经进行了调整,因此我为新部分提供了下一组 promise ,以在获取数据后处理数据。

(不过我不太擅长 Q,这段代码可能需要进一步调整)。

关于node.js - 复杂的 Promise 序列 - 嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34960392/

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