gpt4 book ai didi

javascript - 如何在 bluebird Promise 中修改express.res,并在另一个 Promise 中使用 res?

转载 作者:行者123 更新时间:2023-12-03 05:41:20 25 4
gpt4 key购买 nike

我可能想得太多了,但是请耐心等待......如果我有以下代码

app.get('/api/endpoint', function(req, res, next) {
new Promise(function() {
// doing something that takes lots of code
return someJson
})
.then(function(someJson) {
// analyze someJson with lots of code
})
.then(function() {
// do more
})
// chain a bunch more promises here
.then(function() {
res.status(200).send(message)
})
.catch(function(err) {
// error handling
})
.finally(function() {
// clean up
})
})

如果 promise 链变得很长,导航端点可能会很痛苦。所以,我希望 promise 的每一步都是它自己的函数(以简化上面的代码)。所以我可以重写前 2 个 promise :

function findSomeJson() {
return new Promise(function() {
// doing something that takes lots of code
return someJson
})
}

function analyzeSomeJson(someJson) {
return new Promise(function(someJson) {
// analyze someJson with lots of code
})
}

现在,每个函数都可以在原始示例中使用,如下所示:

findSomeJson()
.then(function(someJson) {
return analyzeSomeJson(someJson)
})
// etc...

但是,如果我需要在这些 promise 内调整 res 会发生什么?我是否需要每次都返回 res 并将 someJson 存储在 res 中?而且,如果我必须使用 next() 会发生什么?如何确保 res 在我的 promise 链末尾被修改?我不能在 finally() 中做到这一点,我必须在最后的 promise 中做到这一点吗?

最佳答案

如果您确实希望能够在函数内更改 res,则必须将其传递。我认为传递它的最简单/最干净的方法是使用 bind像这样:

findSomeJson()
.then(analyzeSomeJson.bind(this, res))
.then(doMore.bind(this, res))
.then(andEvenMore.bind(this, res))...

然后 analyzeSomeJson 定义将如下所示:

// .bind makes it so that res is the first argument when it is called
function analyzeSomeJson(res, someJson) {
return new Promise(function(someJson) {
// analyze someJson with lots of code
})
}

但我可能会尝试避免传递 res,以便只有您的 Controller 必须了解 reqres。您可以将所有功能移至一个或多个服务,并让 Controller 根据服务返回的内容确定 res 需要发生什么。希望这将带来可维护/可测试的代码。

更新非常简单的服务示例

// endpoint.js
var jsonService = require('./jsonService.js');

app.get('/api/endpoint', function(req, res, next) {
jsonService.getJson()
// chain a bunch more promises here
.then(function(json) {
if(json === null) {
return res.status(404).send('Not Found');
}
res.status(200).send(json);
})
.catch(function(err) {
// error handling
});
});

您可以通过多种方式实现您的服务,但实际上它只是您在“ Controller ”或端点.js 中需要的另一个 .js 文件。无论您导出什么,都将是您的“公共(public)”方法。

// jsonService.js

// "public" methods
var service = {
getJson: function() {
return findSomeJson().then(analyzeSomeJson);
}
};

module.exports = service;

// "private" methods
function findSomeJson() {
return new Promise(function() {
// doing something that takes lots of code
return someJson
});
}

function analyzeSomeJson(someJson) {
return new Promise(function(someJson) {
// analyze someJson with lots of code
});
}

关于javascript - 如何在 bluebird Promise 中修改express.res,并在另一个 Promise 中使用 res?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40518002/

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